使用 DistCp 迁移数据至分层命名空间 Bucket
更新时间:2024-08-16
Hadoop DistCp 使用
DistCp(分布式拷贝)是 Hadoop 自带的用于大规模集群内部和集群之间拷贝的工具。 它使用 Map/Reduce 实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为 Map 任务的输入,每个任务会完成源列表中部分文件的拷贝。
对于 HDFS 集群和 BOS 间的数据拷贝,可以借助 BOS HDFS 工具,像标准的 Hadoop DistCp 那样。
前置工作
如上,下载 BOS HDFS 相关 jar 包,并做一些必要的配置。
以数据源端是 HDFS 集群,目的端是 BOS 为例,检查源和目的端的读写正常。
$ hadoop fs -get hdfs://host:port/xxx ./
$ hadoop fs -put xxx bos://bucket/xxx
开始拷贝
普通拷贝
# 从hdfs的src,拷贝到bos指定bucket下的dst路径,默认情况会跳过已经存在的目标文件
$ hadoop distcp hdfs://host:port/src bos://bucket/dst
注意:使用 CRC 校验拷贝前后的数据,BOS HDFS 需设置 fs.bos.block.size 和源 HDFS 一致,并开启 fs.bos.crc32c.checksum.enable;仅支持 HDFS 的 dfs.checksum.combine.mode=COMPOSITE_CRC 校验算法。
更新和覆盖
# 拷贝,执行覆盖的唯一标准是源文件和目标文件大小是否相同,如果不同,则源文件替换目标文件
$ hadoop distcp -update hdfs://host:port/src bos://bucket/dst
# 拷贝,并覆盖已经存在的目标文件
$ hadoop distcp -overwrite hdfs://host:port/src bos://bucket/dst
拷贝多个源
# 指定多个源路径
$ hadoop distcp hdfs://host:port/src1 hdfs://host:port/src2 bos://bucket/dst
# 从文件里获得多个源
# srcList的内容是类似hdfs://host:port/src1、hdfs://host:port/src2的多行源路径
$ hadoop distcp hdfs://host:port/srcList bos://bucket/dst
注意:多个源的拷贝可能会有冲突,参考标准 Hadoop DistCp 的处理。
更多配置
# 指定拷贝数据时map的数目
# 更多的map数量可能不会提升数据吞吐,反而会带来一些问题,map数量应该根据集群资源和拷贝数据规模综合设定
$ hadoop distcp -m 10 hdfs://host:port/src bos://bucket/dst
# 忽略失败的map,但会保留失败操作日志
$ hadoop distcp -i hdfs://host:port/src bos://bucket/dst
# 动态分配任务
# 默认的分配策略是基于文件大小,在更新拷贝时候,因为有跳过文件,实际拷贝时候有类似"数据倾斜"的问题,耗时最长的map拖慢整体进度
$ hadoop distcp -strategy dynamic -update hdfs://host:port/src bos://bucket/dst
更多配置参数,输入 hadoop distcp
命令即可获取帮助信息。