Ubuntu HDFS迁移如何操作
小樊
41
2025-12-06 22:59:06
Ubuntu 环境下 HDFS 迁移实操指南
一 迁移方案总览
- 同版本或协议兼容集群优先使用 DistCp 直接跨集群拷贝,命令简洁、可并行、具备断点续传与一致性校验能力。示例:
hadoop distcp hdfs://src:8020/path hdfs://dst:8020/path。
- 跨版本或 HTTP 访问场景可用 WebHDFS/HFTP 协议进行拷贝(如从 1.x → 2.x/3.x),规避客户端版本不兼容问题。
- 超大表或海量小文件可按分区并行,必要时用 Python/Spark 驱动 hdfs dfs -cp 提升小文件吞吐。
- 网络带宽受限或两集群网络隔离时,可引入 对象存储(如 COS) 作为中转,先迁到对象存储,再回迁到目标 HDFS。
- 若需将 HDFS 挂载为本地目录进行脚本化搬迁,可在 Ubuntu 上使用 HDFS FUSE 挂载后再用 rsync/cp 等工具迁移。
二 迁移前准备
- 评估数据规模与节奏:用
hdfs dfs -du -h / 统计目录体量,按业务/目录/时间分批迁移,减少对线上影响。
- 网络与带宽:确认两集群网络连通性与可用带宽,必要时在 低峰时段 执行;用 DistCp 的 -bandwidth 限制单 map 带宽,避免挤占业务。
- 连通与安全:Kerberos 环境需提前完成 主体/keytab 配置与互信;仅在内网/专线执行,必要时启用加密传输。
- 目标集群能力:确保 YARN/磁盘/NameNode/DataNode 资源充足;迁移前做 小数据量(如 100GB/500GB/1TB) 试跑,校准速率与问题。
- 一致性策略:规划 全量 + 增量 策略;对可能变更的数据,使用 快照 + DistCp -diff 或 -update/-append 做增量同步。
三 标准操作步骤
- 基于 DistCp 的全量迁移
- 同版本直连:
hadoop distcp -m 100 -bandwidth 200 hdfs://src-nn:8020/data hdfs://dst-nn:8020/data
- 跨版本/HTTP 访问:
hadoop distcp -m 100 webhdfs://src-nn:50070/data webhdfs://dst-nn:50070/data
- 常用参数:
- -m 并发 map 数(提升吞吐,结合带宽与集群资源设置)
- -bandwidth 单 map 带宽上限(单位 MB)
- -p 保留权限/属主/时间戳/ACL/XATTR
- -overwrite / -update / -append 处理目标已存在文件
- -i 忽略失败(适合有删除/变更的目录)
- -diff 基于快照做增量差异拷贝
- -log <log_dir> 保存作业日志,便于审计与重试
- 增量与一致性保障
- 快照差分:先在源集群为关键目录创建 快照,迁移窗口后再次创建快照,用
hadoop distcp -diff <snap1> <snap2> hdfs://src/path hdfs://dst/path 仅拷贝差异。
- 直接增量:若无法用快照,可用 -update(仅更新大小/时间戳不一致的文件)或 -append(追加新数据到已存在文件)。
- 失败容忍:对删除/变更导致的个别文件失败,用 -i 忽略并后续单独处理。
- 小文件/超大表优化
- 按分区并行:对 Hive 分区表,按分区列表并发执行拷贝(Python/Spark 调度 hdfs dfs -cp 或 DistCp),显著优于单线程 DistCp 处理海量小文件。
- 资源与并发:合理设置 -m,避免过多小文件导致 NameNode/元数据压力;必要时拆分目录后并行。
- 带宽与窗口控制
- 选择 业务低峰 窗口执行;用 -bandwidth 限制迁移带宽,避免影响线上服务;必要时申请 专线/直连 提升跨机房吞吐。
- 权限与元数据
- 用 -p 保留 rbugpcaxt(复制、块大小、用户、组、权限、校验和类型、ACL、XATTR、时间戳);若未保留,迁移后用 hdfs dfs -chown/chmod 修正。
- 若涉及 Hive/Spark/Flink 表,需同步迁移/调整 metastore、HDFS HA 配置 与作业配置,确保写入与读取指向新集群。
- 校验与回滚
- 校验策略:优先依赖 DistCp 内置 CRC 校验;对关键数据可再做 行数/抽样校验/校验和 比对。
- 回滚预案:保留旧集群 只读窗口 一段时间;增量阶段保留 快照;出现异常可快速回切或重跑失败分片。
四 常见场景命令示例
- 同版本跨集群全量:
hadoop distcp -m 200 -bandwidth 300 -p hdfs://src-nn:8020/warehouse hdfs://dst-nn:8020/warehouse
- 跨版本(HTTP 接口):
hadoop distcp -m 100 webhdfs://src-nn:50070/warehouse webhdfs://dst-nn:50070/warehouse
- 基于快照的增量:
hadoop distcp -diff snapA snapB -p hdfs://src/warehouse hdfs://dst/warehouse
- 仅追加新增数据:
hadoop distcp -update -p hdfs://src/warehouse hdfs://dst/warehouse
- 带日志与忽略失败:
hadoop distcp -i -log /tmp/distcp_logs hdfs://src/logs hdfs://dst/logs
- 带宽受限场景:
hadoop distcp -m 50 -bandwidth 100 hdfs://src/bigdata hdfs://dst/bigdata
五 替代方案与注意事项
- FUSE 挂载搬迁(适合脚本化/临时迁移):在 Ubuntu 安装 hadoop-hdfs-fuse 后,挂载 HDFS 为本地目录,再用 rsync/cp 迁移。示例:
- 安装:
sudo apt-get install hadoop-hdfs-fuse
- 挂载(非 HA):
hadoop-fuse-dfs dfs://<nn_host>:<rpc_port> <mount_point>
- 挂载(HA):
hadoop-fuse-dfs dfs://<nameservice_id> <mount_point>
- 开机挂载:在 /etc/fstab 添加
hadoop-fuse-dfs#dfs://<nn_host>:<rpc_port> <mount_point> fuse allow_other,usetrash,rw 2 0
- 注意:FUSE 性能与稳定性不如 DistCp,适合小体量或过渡性迁移。
- 对象存储中转(COS/OSS/S3):先用 DistCp 迁到对象存储,再迁回目标 HDFS,适合跨机房/跨云或网络隔离场景。
- Kerberos 与高可用:两集群均启用 Kerberos 时,确保 kinit/keytab 可用;跨集群访问需正确配置 nameservices/HA 地址;必要时在 distcp 或客户端配置中允许 fallback-to-simple-auth-allowed(视安全策略而定)。
- 小文件/海量分区:优先按分区并行;若 DistCp 吞吐不佳,可用 Python/Spark 调度 hdfs dfs -cp 提升效率。
- 变更窗口控制:迁移窗口内尽量避免源目录 删除/重命名;必要时用 -i 忽略失败并单独处理,或改用 快照差分。