目录第1章 初识 Linux 与 Shell1.1 什么是 Linux 和 Shell1.2 第一个命令echo第2章 文件系统与基础命令2.1 实验环境准备2.2 路径与导航2.3 文件与目录操作2.4 查看文件内容2.5 文件权限第3章 文本处理三剑客3.1 grep搜索文本3.2 sed流编辑器3.3 awk强大的文本分析工具第4章 进程管理与系统监控4.1 查看进程4.2 后台运行脚本4.3 系统资源监控第5章 Shell 脚本编程5.1 变量与输入5.2 条件判断5.3 循环5.4 函数第6章 环境变量与软件管理6.1 环境变量6.2 包管理Ubuntu6.3 Python 环境与 pip第7章 远程连接与文件传输7.1 SSH 免密登录7.2 scp 文件传输7.3 rsync 同步第8章 大数据与AI高频命令实战8.1 日志分析8.2 批量重命名8.3 查找大文件8.4 定时任务第9章 综合案例AI 训练自动化管道9.1 准备工作创建项目目录和脚本9.2 创建主控脚本 pipeline.sh9.3 赋予权限并运行9.4 设置定时任务可选第十章 大数据迁移策略、方案与企业实战10.1 大数据迁移的核心挑战10.2 从“传输”到“搬运”四类迁移方案对比10.2.1 方案一批量ETL同步 — 适合GB~TB级10.2.2 方案二原生批量加载—破解TB~PB级迁移瓶颈10.2.3 方案三分布式并行迁移 — 单表PB级的破解之道10.2.4 方案四离线物理搬运——EB级的终极方案10.3 企业实战场景精选10.4 迁移方案选型决策树目标面向零基础学员所有案例都可以在 WSLUbuntu环境中直接运行。学完本讲义你将掌握 AI 大数据工程师日常工作中最核心的 Linux 命令和 Shell 脚本编写能力第1章 初识 Linux 与 Shell1.1 什么是 Linux 和 ShellLinux是一个开源的操作系统大多数服务器、大数据集群和 AI 训练平台都运行在 Linux 上。Shell是用户与 Linux 内核交互的命令行界面它接收你输入的命令翻译给系统执行。你现在打开的 WSL 终端就是 Linux 环境提示符类似tianpengDESKTOP-4L1UF5S:~$tianpeng是用户名DESKTOP-4L1UF5S是主机名~表示当前在用户的家目录即/home/tianpeng$表示当前是普通用户权限问题为什么大多数服务器、大数据集群和 AI 训练平台都运行在 Linux 上大多数服务器、大数据集群和AI训练平台选择Linux可以归结为四个核心原因开源免费、极致稳定、生态锁定、硬件掌控。1成本与定制化开源是基石Linux遵循GPL开源协议任何人都可以免费下载、使用和修改。企业无需支付高昂的Windows Server授权费这对拥有成千上万台服务器的数据中心来说节省的成本是天文数字。更重要的是开源意味着企业可以深度定制操作系统内核剥离不需要的功能只为特定任务如高并发网络处理进行极致优化。2稳定性与自动化为服务器而生Linux的图形界面是可选组件服务器版通常只保留命令行所有资源都用于后台服务。一台配置好的Linux服务器可以连续运行数年无需重启。同时Linux天生就是通过命令行和文本配置来管理的这让自动化运维通过Shell脚本、Ansible等工具批量管理数万台机器变得极其简单——这正是大数据和AI集群的刚需。3生态锁定AI与大数据的技术栈只长在Linux上这是最直接的原因。主流AI框架PyTorch、TensorFlow、大数据引擎Hadoop、Spark、Flink和容器技术Docker、Kubernetes全都是基于Linux内核特性开发的。许多底层依赖如NCCL用于GPU通信甚至只提供Linux版本。开发者不是“选择了Linux”而是“要用这些工具就必须在Linux上”。4硬件极限性能释放GPU与网络的潜能在AI训练中GPU集群需要通过RDMA等技术在节点间高速传输大量数据。Linux内核支持用户态网络协议栈和远程直接内存访问RDMA能绕过操作系统瓶颈直接让网卡访问GPU显存将网络延迟降到极低。此外Linux在高性能计算HPC领域的长期积累也确保了它能在数千张GPU的集群中高效稳定地调度资源。所以Linux之所以成为服务器和AI领域的事实标准是因为它提供了一条成本最低、性能最高、能完全掌控硬件的路径而整个现代技术生态也恰好只存在于这条路径上。1.2 第一个命令echoecho Hello, AI Engineer!输出Hello, AI Engineer!echo用于在屏幕上打印文字。第2章 文件系统与基础命令2.1 实验环境准备为了让你能够动手操作我们先创建一套模拟的数据目录和文件。请依次执行以下命令# 创建多级目录~/ai_project/data/logs # -p 参数如果父目录不存在则自动创建避免报错 mkdir -p ~/ai_project/data/logs # 切换到刚创建的项目目录 cd ~/ai_project # # 以下开始创建模拟的数据文件 # # 创建 users.csv 文件第一行是表头 # 表示覆盖写入文件不存在则创建存在则清空后写入 echo user_id,name,score data/users.csv # 向 users.csv 追加三条数据记录 # 表示追加写入在文件末尾添加新内容不清空原有内容 echo 101,Alice,95 data/users.csv # 追加第一条数据 echo 102,Bob,78 data/users.csv # 追加第二条数据 echo 103,Charlie,88 data/users.csv # 追加第三条数据 # # 以下创建模拟的应用日志文件 # # 创建 app.log 文件写入第一条 INFO 日志 echo INFO:Server started data/logs/app.log # 追加一条 ERROR 级别的日志 echo ERROR:Connection timeout data/logs/app.log # 追加第二条 INFO 日志 echo INFO:Shutdown complete data/logs/app.log # # 以下创建模拟的 Python 训练脚本 # # 创建 train.py 文件写入第一行代码导入 numpy 库 echo import numpy train.py # 追加第二行代码打印训练提示信息 echo print(training...) train.py执行完毕后你的目录结构应该是这样的~/ai_project/ ├── data/ │ ├── logs/ │ │ └── app.log # 包含3条日志记录 │ └── users.csv # 包含表头和3条用户数据 └── train.py # 包含两行Python代码验证一下# 查看目录结构 ls -R ~/ai_project # 查看 users.csv 的内容 cat ~/ai_project/data/users.csv # 查看 app.log 的内容 cat ~/ai_project/data/logs/app.log # 查看 train.py 的内容 cat ~/ai_project/train.py2.2 路径与导航pwd # 查看当前目录输出/home/tianpeng/ai_project ls # 列出当前目录下的文件和文件夹 ls -l # 详细信息 ls -a # 包括隐藏文件 cd data # 进入 data 目录 cd .. # 返回上级目录 cd ~ # 回到用户家目录 cd ~/ai_project # 使用绝对路径进入项目目录2.3 文件与目录操作# 复制文件 cp data/users.csv data/users_backup.csv ls data/ # 可以看到多了一个文件 # 移动重命名文件 mv data/users_backup.csv data/users_v2.csv ls data/ # 删除文件 rm data/users_v2.csv # 创建和删除目录 mkdir data/temp rmdir data/temp # 只能删除空目录2.4 查看文件内容cat data/users.csv # 一次性显示全部 head -n 2 data/users.csv # 前两行 tail -n 1 data/users.csv # 最后一行 # 实时查看日志模拟 tail -f data/logs/app.log # 按 CtrlC 停止2.5 文件权限ls -l train.py # 输出类似-rw-r--r-- 1 tianpeng tianpeng 25 May 30 10:00 train.py # rw- 表示所有者可读写r-- 表示组用户只读r-- 表示其他用户只读 chmod x train.py # 添加执行权限 ls -l train.py # 现在变成 -rwxr-xr-x ./train.py # 可以直接执行第3章 文本处理三剑客3.1 grep搜索文本、grep ERROR data/logs/app.log # 搜索包含 ERROR 的行 grep -v INFO data/logs/app.log # 排除包含 INFO 的行 grep -i error data/logs/app.log # 忽略大小写 grep -r import . # 递归搜索当前目录下所有文件3.2 sed流编辑器sed s/ERROR/CRITICAL/g data/logs/app.log # 将 ERROR 替换为 CRITICAL只输出不修改 sed -i s/101/201/ data/users.csv # 直接修改文件内容把101改成201 cat data/users.csv # 检查修改结果3.3 awk强大的文本分析工具# 打印 users.csv 的第二列姓名 awk -F , {print $2} data/users.csv # 打印成绩大于90的行 awk -F , $390 data/users.csv # 计算成绩的平均分 awk -F , {sum$3; count} END {print sum/count} data/users.csv第4章 进程管理与系统监控4.1 查看进程ps aux | head # 查看系统进程 ps aux | grep bash # 查找当前终端进程4.2 后台运行脚本创建一个模拟训练脚本train_model.sh# 创建脚本 cat EOF ~/ai_project/train_model.sh #!/bin/bash echo Training started at $(date) sleep 30 echo Training finished at $(date) EOF # 修改权限 chmod x ~/ai_project/train_model.sh后台执行cd ~/ai_project nohup ./train_model.sh training.log 21 nohup保证即使关闭终端也不中断重定向标准输出到文件21将错误输出也合并到标准输出放到后台运行查看后台任务jobs # 查看当前终端的后台任务 cat training.log4.3 系统资源监控df -h # 磁盘使用情况 free -h # 内存使用 top -bn1 | head # 一次性查看系统负载第5章 Shell 脚本编程5.1 变量与输入我们首先创建一个叫var_demo.sh的脚本文件。这里我们使用cat命令配合 EOF一次性写入多行内容。# 确保我们在项目根目录 cd ~/ai_project # 使用 cat EOF 创建 var_demo.sh 文件 # 下面这条命令会等待你输入内容直到单独一行出现 EOF 才会结束 cat EOF var_demo.sh #!/bin/bash # 变量与输入演示脚本 nameAI工程师 echo Hello, $name read -p 请输入你的年龄 age echo 你的年龄是$age岁 current_date$(date %Y-%m-%d) echo 今天是 $current_date EOFcat EOF var_demo.sh把接下来输入的内容写入var_demo.sh直到遇到EOF为止。脚本第一行#!/bin/bash是 shebang指定用 bash 解释器执行。nameAI工程师定义变量等号两边不能有空格。read -p 提示语 变量名用来读取用户输入。$(date %Y-%m-%d)是命令替换会执行date命令并把输出结果赋值给变量。赋予执行权限并运行chmod x var_demo.sh # 给文件添加可执行权限 ./var_demo.sh # 执行脚本按提示输入年龄即可看到效果5.2 条件判断接下来创建check_score.sh同样用cat EOF写入。# 创建 check_score.sh 文件并向文件中写入shell脚本 cat EOF check_score.sh #!/bin/bash # 成绩等级判断脚本 read -p 请输入成绩 score if [ $score -ge 90 ]; then echo 优秀 elif [ $score -ge 80 ]; then echo 良好 elif [ $score -ge 60 ]; then echo 及格 else echo 不及格 fi EOF # 授权 chmod x check_score.sh # 执行脚本 ./check_score.sh # 输入不同分数查看不同评级说明if [ 条件 ]; then语法中的方括号内部前后必须有空格。-ge表示大于等于-lt表示小于-eq表示等于。elif可以写多个分支else是以上都不满足时执行。5.3 循环创建batch_process.sh用来遍历某个目录下所有的 CSV 文件并统计行数。cat EOF batch_process.sh #!/bin/bash # 批量处理 CSV 文件统计每个文件的行数 # 遍历 ~/ai_project/data/ 目录下所有 .csv 文件 for file in ~/ai_project/data/*.csv; do echo 正在处理文件$file wc -l $file done EOF # 授权 chmod x batch_process.sh # 执行 ./batch_process.sh5.4 函数创建function_demo.sh演示脚本内自定义函数。# 创建 function_demo.sh 文件 cat EOF function_demo.sh #!/bin/bash # 函数演示脚本 greet() { echo 你好$1欢迎学习$2 } # 调用函数传入两个参数 greet 小明 大数据 EOF # 授权 chmod x function_demo.sh # 执行shell脚本 ./function_demo.sh说明greet()是函数定义$1和$2分别表示第一个和第二个参数。函数调用直接写函数名后跟参数即可。第6章 环境变量与软件管理本章内容以命令演示为主不需要创建脚本文件但需要你逐条执行。6.1 环境变量echo $PATH # 打印可执行文件搜索路径 echo $HOME # 打印当前用户家目录 export MY_NAMEtianpeng # 临时设置环境变量仅当前会话有效 echo $MY_NAME # 永久生效写入 ~/.bashrc echo export MY_NAMEtianpeng ~/.bashrc source ~/.bashrc # 重新加载配置文件使环境变量立即生效 echo $MY_NAME # 再次打印确认永久生效6.2 包管理Ubuntusudo apt update # 更新软件源需要输入你的用户密码 sudo apt install -y htop # 安装 htop-y 表示自动确认 htop # 启动 htop按 q 退出6.3 Python 环境与 pippython3 --version # 查看已安装的 Python3 版本第7章 远程连接与文件传输7.1 SSH 免密登录SSH免密登录是通过密钥对进行身份验证从而省去每次连接时输入密码的繁琐步骤。其原理是在客户端使用ssh-keygen生成一对公钥和私钥然后将公钥复制到远程服务器的~/.ssh/authorized_keys文件中。当客户端发起连接时服务器会用该公钥加密一个随机字符串发送给客户端客户端必须用对应的私钥解密并返回从而证明自己的身份整个过程无需传输或存储明文密码。对于大数据和AI集群来说这是自动化运维的基础因为它能让脚本、分布式系统以及节点间的数据拷贝在无人值守的情况下安全、无缝地执行。# 先生成密钥对如果之前已经生成过可跳过这一步 ssh-keygen -t rsa -f ~/.ssh/id_rsa -N # 把自己的公钥追加到 authorized_keys 文件授权给自己 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys # 修改权限 chmod 600 ~/.ssh/authorized_keys # 启动 SSH 服务WSL 默认可能没有启动 sudo service ssh start # 尝试用 ssh 连接自己验证免密是否成功 ssh localhost # 第一次会提示是否信任输入 yes之后应该直接登录。 # 登录成功后输入 exit 退出。 exit7.2 scp 文件传输SCPSecure Copy Protocol是一种基于 SSHSecure Shell协议进行安全文件传输的命令行工具它利用 SSH 的加密通道在本地与远程服务器之间、或两台远程服务器之间拷贝文件因此传输过程是加密且安全的。其命令格式通常为scp [源路径] [目标路径]可以将本地文件上传到远程scp localfile userhost:/remote/path或从远程下载文件到本地scp userhost:/remote/path localfile并支持递归拷贝整个目录-r选项和保留文件属性-p选项。对于 AI 大数据工程师而言SCP 常用于将本地训练脚本、数据集上传到云 GPU 服务器或者从集群中下载训练好的模型权重和日志是实现远程协作与自动化部署的基础传输手段。mkdir ~/backup # 创建备份目录 # 使用 scp 将 users.csv 复制到本机的 ~/backup 目录 scp ~/ai_project/data/users.csv localhost:~/backup/ # 检查是否拷贝成功 ls ~/backup/7.3 rsync 同步RSYNCRemote Sync是一款高效的远程文件同步工具它最大的特点是增量传输——只拷贝源和目标之间发生变化的那部分数据而不是每次都全量复制从而极大节省带宽和时间。它基于 SSH 协议进行安全传输常用命令为rsync -avz 源路径 userhost:目标路径其中-a保持文件属性、-v显示详情、-z压缩传输。对于 AI 大数据工程师来说rsync 常用于将本地开发好的代码和数据集快速同步到远程 GPU 集群或在多个训练节点之间定时同步模型权重和日志。# 将整个 data 目录同步到备份目录下的 data_sync 子目录 rsync -avz ~/ai_project/data/ ~/backup/data_sync/ # 查看同步结果 ls ~/backup/data_sync/第8章 大数据与AI高频命令实战8.1 日志分析# 回到 ai_project 目录 cd ~/ai_project # 统计 app.log 中各日志级别出现的次数 # grep -oE 提取匹配的单词sort 排序uniq -c 统计重复次数 grep -oE INFO|ERROR data/logs/app.log | sort | uniq -c8.2 批量重命名cd ~/ai_project # 先创建几个 .txt 文件用于测试 touch note1.txt note2.txt note3.txt # 遍历所有 .txt 文件将后缀改为 .md for f in *.txt; do mv $f ${f%.txt}.md done # 查看改过之后的文件 ls *.md8.3 查找大文件# 查找当前目录下文件大小大于 1KB 的文件 find . -type f -size 1k8.4 定时任务sudo service cron start # 启动 cron 服务 crontab -e # 编辑当前用户的定时任务 直接按 回车键Enter 即可 # 在打开的编辑器中添加一行 * * * * * echo 每分钟执行一次 ~/ai_project/cron_test.log # 保存并退出后等待两三分钟然后查看结果 cat ~/ai_project/cron_test.log按ctrl o-Enter-ctrl x完成保存并退出第9章 综合案例AI 训练自动化管道9.1 准备工作创建项目目录和脚本# 创建管道专用目录 mkdir -p ~/ai_project/pipeline cd ~/ai_project/pipeline1创建数据预处理脚本preprocess.shcat EOF preprocess.sh #!/bin/bash echo Preprocessing data... sleep 2 echo Data preprocessed. preprocess.log EOF2创建训练脚本train.pycat EOF train.py #!/usr/bin/env python3 import datetime print(fTraining started at {datetime.datetime.now()}) # 模拟训练过程 import time time.sleep(5) print(Training completed.) EOF9.2 创建主控脚本pipeline.shcat EOF pipeline.sh #!/bin/bash set -e # 任何一条命令出错就立刻退出 LOGFILE~/ai_project/pipeline/pipeline.log echo Pipeline started at $(date) $LOGFILE # 1. 数据预处理 ./preprocess.sh echo Preprocess done. $LOGFILE # 2. 模型训练 python3 train.py $LOGFILE 21 echo Training done. $LOGFILE # 3. 归档结果 tar -czf results_$(date %Y%m%d).tar.gz preprocess.log echo Archive created. $LOGFILE echo Pipeline finished at $(date) $LOGFILE EOF9.3 赋予权限并运行chmod x preprocess.sh pipeline.sh train.py ./pipeline.sh运行成功后查看日志cat pipeline.log同时results_20260530.tar.gz文件也会生成里面包含preprocess.log。9.4 设置定时任务可选如果想让它每天凌晨2点自动执行可以编辑 crontabcrontab -e # 添加一行 0 2 * * * /home/tianpeng/ai_project/pipeline/pipeline.sh至此每个Shell脚本的完整创建过程、命令注释和执行方法都已详细给出。你可以对照上面的步骤在WSL中从头到尾操作一遍确保完全掌握。第十章 大数据迁移策略、方案与企业实战学习目标理解大数据迁移的核心挑战掌握从传统ETL批量同步到分布式并行加载、从在线传输到离线物理搬运的多层次迁移方案并能够根据数据量级、网络条件和业务容忍度选择最合适的迁移策略。10.1 大数据迁移的核心挑战在企业数字化转型和云迁移过程中大数据迁移是最棘手也最容易出问题的环节。和传统数据库迁移不同大数据迁移面临三个根本性难题挑战一数据量级巨大常规工具不堪重负传统数据库迁移比如从MySQL搬到PostgreSQL数据量通常在GB到TB级别一个mysqldump加psql就能搞定。但大数据场景下数据量动辄从TB起步向PB甚至EB级别延伸。这种量级下任何依赖单机处理的工具都会成为瓶颈 — 不是内存溢出就是传输时间以周甚至月为单位。mysqldump是 MySQL 数据库自带的逻辑备份工具能将数据库结构和数据导出为 SQL 文本文件psql是 PostgreSQL 的交互式命令行客户端可执行 SQL 文件将数据导入 PostgreSQL。两者结合常用于从 MySQL 迁移数据到 PostgreSQL先用mysqldump导出 MySQL 数据为 SQL 文件再用psql执行该文件完成导入。-- 直接通过SQL脚本来完成。挑战二异构生态之间的“方言不通”大数据迁移很少发生在同构系统之间。企业经常需要把数据从自建的Hadoop集群迁移到云上的MaxCompute或者从Hive迁移到Iceberg湖仓一体架构又或者从ClickHouse迁移到StarRocks。这些系统在存储格式、元数据管理、SQL方言、分区策略上完全不同迁移不仅仅是“把文件拷过去”而是需要格式转换、Schema适配、数据校验等一整套工作。挑战三业务连续性要求下的增量同步PB级数据迁移不可能让业务停机等待。初始的全量迁移可能需要几天甚至几周在这期间源端数据仍在不断写入。如何在全量迁移完成后把增量数据无缝追上并在某个时间点完成“割接”是迁移方案设计中必须解决的问题。挑战四传统数据集成工具如DataX、Sqoop的局限你可能会想到用DataX、Sqoop这类数据集成工具来做迁移。这些工具确实擅长常规的ETL同步但在PB级迁移场景下会遇到明显的天花板单机架构瓶颈DataX是单机程序所有数据读写都通过一台机器中转即使开启了多线程这台机器的网卡带宽和CPU能力也有限。在千兆网络环境下DataX的实际传输速度通常在30-50MB/s迁移1PB数据需要超过230天——这在业务上完全不可接受。缺乏分布式协调DataX的并发局限于单机多线程无法把任务分散到集群的多台机器上并行执行无法横向扩展。断点续传支持弱TB级以上迁移过程中途出错概率大传统工具通常只能重跑整个任务缺乏从断点精确恢复的能力。异构元数据适配差DataX可以搬运数据文件但无法处理分区策略变更、Schema演进、ACID事务等高级表特性。从Hive迁移到MaxCompute或Iceberg时这些特性往往需要人工处理。10.2 从“传输”到“搬运”四类迁移方案对比面对这些挑战企业常用的迁移方案可以归纳为四大类从轻到重、从慢到快依次递进。方案核心思路适用量级速度量级典型工具批量ETL同步通过数据集成工具Reader读取源端、Writer写入目标端GB~TBMB/s~GB/hDataX、Sqoop、SeaTunnel原生批量加载绕过中间层直接使用目标端原生的高速加载接口TB~PBGB/sMaxCompute Tunnel、StarRocks Stream Load、Iceberg Load Data分布式并行迁移将数据集切分在多个节点上同时跑加载任务PB数十GB/s自研脚本 目标端批量加载离线物理搬运将数据拷贝到硬件设备快递寄送到云厂商机房后导入EB级物理速度阿里云闪电立方、AWS Snowmobile10.2.1 方案一批量ETL同步 — 适合GB~TB级这是你最熟悉的方式。通过配置数据集成工具如DataX的JSON任务、DataWorks的可视化任务定义Reader和Writer将数据从源端抽取到目标端。这种方式胜在简单易用全程有界面的编排和监控适合日常的数仓ETL和中小规模数据迁移。适用场景单表GB级、总数据量TB级以下的迁移需要定时增量同步的场景。局限当数据量达到数十TB以上单机处理能力就会成为瓶颈。即使用SeaTunnel这类支持分布式的工具速度有提升但仍然受限于Reader和Writer的适配能力和网络中间节点。注意数据类型的问题把mysqldump导出的文件直接扔进psql执行大概率会执行失败。正确的做法是在导出时加上--compatiblepostgresql参数尽量生成PG兼容的SQL导出后用sed脚本批量替换不兼容的类型和语法再手动检查一遍DDL最后才在psql中执行导入。对于系统级的自动迁移仍需预先配置好类型映射表否则迁移就会因类型不匹配而中断。10.2.2 方案二原生批量加载—破解TB~PB级迁移瓶颈这是企业做大规模数据迁移的首选方案。核心思路是“绕过中间商直接走专线”——不再通过数据集成工具的Reader-Writer中转而是直接使用目标端数据库或数据平台的原生高速导入接口。原理解析MaxCompute Tunnel、StarRocks Stream Load、Iceberg的LOAD DATA命令都是目标端专门为批量数据加载设计的高性能接口。它们的共同特点是流式直写数据流直接写入底层存储分布式文件系统或对象存储不经过SQL解析层和事务层高并发多通道支持将单个大文件切分成多个块多线程并行上传客户端轻量客户端只负责读文件和发数据计算开销极小可以充分打满网络带宽方案优势速度大幅提升单机Tunnel上传可达100-200MB/s是DataX的3-5倍若在多个节点上同时跑速度可以线性叠加到GB/s级别全量增量均可覆盖全量使用批量加载增量用目标端的增量写入接口如MaxCompute的Streaming Tunnel失败可重试单个文件上传失败只需重新上传该文件即可不需要重跑整个任务实操案例Hadoop到MaxCompute的Tunnel批量加载假设我们需要将Hadoop集群中/user/hive/warehouse/db/table/目录下的Parquet文件全部迁移到MaxCompute。步骤一在Hadoop客户端节点生成待迁移文件清单hadoop fs -ls /user/hive/warehouse/db/table/dt2024-01-01/*.parquet \ | awk {print $8} /tmp/upload_list.txt步骤二编写Tunnel上传脚本#!/bin/bash # tunnel_upload.sh逐行读取文件列表使用Tunnel上传 while IFS read -r file; do odpscmd tunnel upload \ --projectmy_project \ --tabletarget_table \ --partitiondt2024-01-01 \ -bs102400 \ $file done $1步骤三将文件列表分割在多台机器上并行执行# 将文件列表分成20份 split -n l/20 /tmp/upload_list.txt /tmp/upload_part_ # 在多个节点上分别执行最大化并行度 # node1: bash tunnel_upload.sh /tmp/upload_part_aa # node2: bash tunnel_upload.sh /tmp/upload_part_ab # ...这种方式可以将迁移速度从DataX的几十MB/s提升到数GB/s数十TB的数据可以在数小时内完成迁移。10.2.3 方案三分布式并行迁移 — 单表PB级的破解之道当单表或单分区就达到PB级时即使目标端支持高速批量加载单机处理也会有瓶颈——机器网卡通常只有10Gbps或25Gbps理论极限也就1-3GB/s。要突破这个瓶颈必须在多台机器上同时跑上传任务。原理解析分布式并行迁移的本质是把待迁移的数据集按照文件维度切分成N份在N个不同的节点上同时启动上传进程每个节点只负责自己那一份。总吞吐量大致等于“单机吞吐量 × 节点数”。方案优势吞吐线性扩展增加节点即可提升总速度不依赖中心调度各节点独立运行无协调开销利用现有集群资源可以直接在Hadoop集群的DataNode节点上运行脚本让数据不跨网络读取注意事项每个节点的上传脚本需要独立记录进度以便失败后从断点恢复最终所有节点上传完成后目标端可能存在大量小文件需要在目标端执行一次合并Compaction操作这种方案需要一定的脚本编写和运维能力10.2.4 方案四离线物理搬运——EB级的终极方案当数据量达到EB级别即使有万兆带宽纯线上传输也需要数周甚至数月。此时最有效的方式是物理搬运——把数据拷进一个专用硬件设备用快递寄到云厂商机房由云厂商直接把数据灌入目标系统。这种方式听起来原始但在超大规模数据面前物理带宽一辆卡车满载硬盘在高速上跑的吞吐量远超任何网络专线。阿里云闪电立方、AWS Snowmobile都是基于这个原理。适用场景百TB到EB级别的云迁移或者网络条件极差专线未开通、跨国带宽有限的场景。10.3 企业实战场景精选场景一金融企业Hadoop向云上MaxCompute迁移200TB背景某银行将线下Hadoop集群的200TB历史数据迁移到阿里云MaxCompute为后续AI风控模型训练提供统一数据底座。要求在一个周末窗口48小时内完成全量迁移。为什么常规DataWorks方案不够200TB数据用DataWorks集成任务按30MB/s算需要约80天远超48小时窗口。采用方案原生批量加载 — MaxCompute Tunnel 分布式并行上传。执行过程1在Hadoop集群的10个DataNode节点上各部署一个Tunnel上传脚本2将待迁移文件列表平均分给10个节点310个节点同时上传单节点吞吐约80MB/s总吞吐约800MB/s4全量迁移耗时约70小时两个周末窗口内完成场景二电商企业Hive到Iceberg的湖仓升级500TB背景某电商企业将数据湖从Hive格式全面升级为Iceberg湖仓一体架构需要把500TB的存量Hive表转换为Iceberg表。为什么不是简单拷贝Hive表和Iceberg表的元数据管理方式完全不同。Hive用目录式分区/dt2024-01-01/Iceberg用快照Manifest管理。直接拷贝数据文件会让Iceberg无法识别这些文件。采用方案Spark批量重写 — 使用Spark SQL的CREATE TABLE AS SELECT语法读取Hive表写入Iceberg表。Spark会自动完成格式转换和元数据生成。执行过程-- 对每张Hive表执行 CREATE TABLE iceberg_db.target_table USING iceberg PARTITIONED BY (dt) AS SELECT * FROM hive_db.source_table;通过DolphinScheduler编排数百张表并行转换500TB数据在一个月内分批完成迁移同时借助Iceberg的时间旅行功能保留了所有历史快照。场景三跨国制造企业数据中心整体上云1.5PB背景某制造企业关闭海外数据中心将1.5PB历史数据整体迁移到云上。跨国专线带宽仅500Mbps且不稳定。采用方案离线物理搬运——阿里云闪电立方。执行过程1阿里云寄送两个闪电立方设备单台容量1PB到企业机房2企业IT团队将数据拷贝到设备中耗时约一周3设备快递寄回阿里云数据中心4阿里云工程师将数据导入客户的项目中耗时约一周5从寄出到数据可用总计约三周远快于线上传输的数月预估场景四广告平台从ClickHouse实时迁移到StarRocks100TB背景某广告平台将实时分析引擎从ClickHouse迁移到StarRocks以降低存储成本并提升查询性能。要求迁移期间业务不可中断查询延迟不能明显上升。采用方案StarRocks Stream Load批量加载 双写兜底。执行过程1历史数据用Stream Load批量导入StarRocks发挥其列存高吞吐写入能力2增量数据通过Flink CDC同时写入ClickHouse和StarRocks3验证StarRocks的查询性能和结果正确性后将BI和业务查询流量逐步切到StarRocks4稳定运行一周后下线ClickHouse完成割接10.4 迁移方案选型决策树在实际项目中你可以按照以下决策树快速选择方案数据量有多大 ├── GB~TB级 │ └── 方案一批量ETL同步DataX / SeaTunnel │ 优势配置简单任务可调度增量同步成熟 │ ├── TB~PB级单表数百TB │ └── 方案二原生批量加载MaxCompute Tunnel / StarRocks Stream Load │ 优势直接走专线速度是ETL工具的3-5倍 │ ├── PB单表PB以上或集群总数据量数十PB │ └── 方案三分布式并行迁移 │ 优势多节点同时加载吞吐可线性扩展 │ └── EB级或网络条件极差跨国、弱网 └── 方案四离线物理搬运闪电立方 / Snowmobile 优势物理速度碾压任何网络迁移成功的三个关键检查点1总量核对迁移前后行数、文件数、总数据大小是否一致2抽样验证随机抽取数千行检查具体字段值是否完全一致3聚合比对对关键指标如总金额、日均交易笔数在源端和目标端分别计算确保差异在可接受范围内只有在完成这三个校验之后一次数据迁移才能算真正完成。