游客发表

大家好,篇文我是章彻明哥!
最近有小伙伴问到 hadoop distcp 的使用,对其中的底掌一些细节和容易踩的坑不是很清楚,所以今天我们来看下 hadoop distcp 的跨跨版原理,细节和容易踩的集群据同具坑。
我们知道大数据集群内部都有节点级别和机架级别的本数步工容错机制(存储层对应的就是传统的三副本或纠删码机制),但对于一些数据安全性要求更改的篇文场景,比如在金融行业典型的章彻两地三中心场景下,经常有跨区域跨集群灾备的底掌需求,此时就会涉及到跨集群的跨跨版数据同步。
DistCp (distributed copy) 就是集群据同具一款跨集群的数据同步工具。
DistCp 可以用来做 hdfs 集群内部或集群之间的本数步工大规模的数据同步,由于在底层使用了 MapReduce 框架会通过多个 mapper 来拷贝需要拷贝的篇文文件列表,其性能相比 hdfs dfs -get/put 等通过本地文件系统中转的亿华云章彻数据同步方案,要高效快速很多。底掌
同时由于 DistCp 可以跨 hdfs 大版本进行数据同步,且新版本的 DistCp(distcp version 2) 相比老版本的DistCp(legacy DistCp,version 1.2.1)在很多方面都做了优化和改进,所以大规模的数据同步,不论是集群内部还是集群之间,首选的方案都是DistCp。
很多商业的hdfs数据同步方案,其底层都是原生的 DistCp,比如 cdh 的 bdr 工具,比如 tdh 的 backup工具,其原理都是如此。
新版 DistCp 底层有以下组件,服务器租用其各自的职责如下:
DistCp Driver:负责解析 DistCp 的命令行参数,并编排协调具体的拷贝任务(首先调用 copy-listing-generator 获得需拷贝的文件列表,然后配置并提交 Map-Reduce 拷贝任务,最后根据配置项返回 MR 任务句柄并推出,或等待 MR任务执行结束;) Copy-listing generator:负责解析给定的 source-paths(目录或文件,可以包含通配符),生成待拷贝的文件/目录列表,并输出到一个 SequenceFile; Input-formats 和 Map-Reduce:负责读取 Copy-listing generator 生成的 SequenceFile 中的待烤包的文件列表,并执行实际的文件拷贝;DistCp 提供了多种参数,来控制拷贝任务的各种细节,经常使用到的关键参数有 -update, -delete, -overwrite, -m, -bandwidth,-diff,-p,-i 等:
-m :控制 map 任务的最大个数;(实际的 map 任务数,不会大于待拷贝的文件的个数;更多的 map 数不一定会提升整体IO吞吐); -bandwidth:控制每个 map 任务可用的最大带宽,单位 MB; -p[rbugpcaxt]:控制是否保留源文件的属性,rbugpcaxt 分别指:replication number, block size, user, group, permission,checksum-type, acl, xattr,以及 tiemstamp; skipcrccheck:控制检查源和目标文件差异以生成待拷贝文件列表时,是否跳过 CRC 校验; update: 如果源和目标目录下的文件,在 文件大小/块大小/checksum 上有不同,就用; -update: 拷贝目标目录下不存在而源目录下存在的文件,或目标目录下和源目录在文件大小/块大小/checksum 上不同的文件; -overwrite: 覆盖目标目录下的同名文件。(如果某个 map 任务执行失败且没有指定 -i 参数,则所有的待拷贝的文件,包括拷贝失败的文件,都会被重新拷贝); -i: 忽略拷贝过程中某些 MAP 任务的错误,继续执行其余的 map拷贝任务,而不是直接失败整个作业;(默认情况下,如果有某个 map 任务失败的次数达到了 mapreduce.map.maxattempts,则未完成的 map 任务都会被 kill;); -delete: 删除目标目录下存在,但源目录下不存在的文件;该参数只能和 -update 或 -overwrite 配合使用; -diff 和 -rdiff:控制是否结合使用快照机制,会基于两个快照的差异(snapshot diff)来确定待拷贝的文件列表,以下要点需要注意: -diff 和 -rdiff,需要配合选项 -update 一起使用; -diff 和 -rdiff,不能和 -delete 一起使用,否则会报错:java.lang.IllegalArgumentException: -delete and -diff/-rdiff are mutually exclusive. The -delete option will be ignored; 该命令的前提条件:需要源目录下有指定的两个快照 from_snapshot 和 to_snapshot; 该命令的前提条件:需要目标目录下有快照 from_snapshot; 该命令的前提条件:需要目标目录在前期制作了 from_snapshot 快照后,没有新的文件写操作 (create, rename, delete); 该命令执行完毕后,目标目录下并不会自动创建快照 to_snapshot,如果后续还需要基于快照来做增量同步,需要手工在同步完毕后对目标目录制作快照 to_snapshot,为后续基于快照的同步(hadoop distcp -diff -update)做好准备;
skipcrccheck 的坑-hdfs

skipcrccheck 的坑-hive sql
执行数据同步操作时,需要停止对目标目录的其它写操作; 当没有对原目录的写操作时(即停止了对源目录的写操作),可以使用以下命令来跨集群同步数据:hadoop distcp -delete -update -pugpb -m 10 -bandwidth 5 hdfs://xx.xx/ hdfs://yy.yy/ 当有对原目录的写操作时(即有对原目录的并发写操作),需要结合快照机制来同步数据:hadoop distcp -diff -update -pugpb 结合快照机制来同步数据时,有以下前提要求:
需要源目录下有指定的两个快照 from_snapshot 和 to_snapshot; 需要目标目录下有快照 from_snapshot; 需要目标目录在前期制作了 from_snapshot 快照后,没有新的文件写操作如 create/rename/delete (即要求目标目录的当前状态跟原目录的from-snapshot一致); 该命令执行完毕后,目标目录下并不会自动创建快照 to_snapshot,如果后续还需要基于快照来做增量同步,需要手工在同步完毕后对目标目录制作快照 to_snapshot,为后续基于快照的同步(hadoop distcp -diff -update)做好准随机阅读
热门排行
友情链接