首页 > 编程知识 正文

一篇文章彻底掌握 HDFS 跨集群跨版本数据同步工具 hadoop disctp

时间:2023-05-04 10:26:43 阅读:13341 作者:22

你好,我是个大眼睛的棒球!

最近有合作伙伴询问了hadoop distcp的使用情况,但对其中的一些细节和容易踩的孔不太清楚,所以今天就来看看hadoop distcp的原理、细节和容易踩的孔吧。

1 DistCp概述表明,大数据群集中有节点级和机架级容错机制。 存储层支持传统的三拷贝或代码删除修复机制。 但是,在某些数据安全要求发生变化的场景中,例如金融业两个典型区域的三个核心场景,往往存在区域之间集群间灾难恢复的需求,在这种情况下,涉及集群之间的数据同步。

分布式复制(dist CP )是群集间的数据同步工具。

DistCp可用于hdfs群集内部或群集之间的大数据同步。 在MapReduce框架的基础上,要复制的文件列表由多个mapper复制,因此与通过本地文件系统(如hdfs dfs -get/put )中继的数据同步方案相比,性能大大提高

DistCp还可以跨hdfs的较大版本同步数据,较新版本的DistCp(distcpversion2)是较旧版本的dist CP (legacydistcp,版本1.2.2 )

许多商业hdfs数据同步方案的基础是本地DistCp,诸如cdh的bdr工具,例如tdh的backup工具,并且其原理完全相同。

2群集间数据同步对于群集间数据同步,可以将数据从原始群集推送至目标群集。 在这种情况下,它消耗原始群集yarn的资源。

群集之间的数据同步还可以从目标群集开始工作,并主动提取原始群集的数据。 在这种情况下,将消耗目标群集的YARN资源。

如果原始群集是生产群集,则通常在目标群集上运行命令hadoop distcp以开始工作,并通过抽取方式同步数据。 在这种情况下,不消耗作为原集群的生产集群的YARN资源。

如果原始群集和目标群集的大型版本不同,例如在hadoop 1.x和hadoop 2.x之间同步数据,则必须使用webhdfs协议。 这意味着以webhd fs 3360//NameNode _ hostname 3360 http _ port格式指定远程群集(当然,可以从原始群集推送数据,也可以从目标群集推送数据)

如果原始群集和目标群集的较大版本相同(例如,全部是hadoop 2.x或全部是hadoop 3.x ),则建议使用hdfs协议。 在这种情况下,性能比webhdfs更好。

如果webhdfs配置了SSL加密,则必须使用协议“swebhdfs://”。

3打开kerberos安全验证后,如果原始群集和目标群集都启用了kerberos验证(Hadoop.security.authentic ation=Kerberos ),则进行数据同步

如果原始群集和目标群集中的一个启用了kerberos身份验证,另一个未启用kerberos身份验证,为简单起见,请在启用了kerberos身份验证的群集上运行distCp,然后通过推送或抽取方式进行数据删除

4 DistCp的基本机制新的DistCp的基础包括以下组件,每个组件的作用如下:

distcpdriver (分析dist CP的命令行参数,调整特定的复制任务(首先调用copy-listing-generator获取要复制的文件列表,然后执行Map-Reduce复制任务) )

复制列表生成器:生成指定的source-paths (可以包含目录或文件、通配符)、要复制的文件/目录的列表,然后单击SequenceFile

Input-formats和map-reduce :负责读取复制列表生成器生成的序列文件烤包文件列表,并执行实际文件复制;

5 DistCp的重要参数说明DistCp提供了各种参数,用于控制复制任务的各种详细信息。 常用的重要参数包括-update、-delete、-overwrite、-m、-bandwidth、-diff、-p和-i。

-m n

um_maps>:控制 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)做好准备;

6 易踩的坑 - skipcrccheck

参数 -skipcrccheck 的意思是 “Whether to skip CRC checks between source and target paths.”,即是否跳过原路径和目标路径下文件的 crc 校验(CRC:Cyclic Redundancy Check)。

如果指定了该参数,会跳过crc校验,同步作业速度会快些;

但指定该参数后,由于不校验 crc,而是通过文件名和文件大小来发现哪些文件需要进行同步,在极端情况下,可能会漏掉某些需要同步的小文件,比如某些只有少数几条记录的小文件,从而造成数据不一致;

下图展示的就是,某两个 hive orc 表都只有1条记录,对应的 HDFS 文件也比较小且都是 299 BYTE, 指定参数 skipcrccheck 执行同步操作时,就遗漏了该文件,造成了源目录与目标目录数据的不一致:“sudo -u hdfs hadoop distcp -update -delete -skipcrccheck -pugpb hdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scp hdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scp2“:

skipcrccheck 的坑-hdfs skipcrccheck 的坑-hive sql 7 关于 hive 的跨集群数据同步

关于 hive的跨集群数据同步,hive 社区在推动 hive replication 的方案,但因为该方案的各种前提和限制,目前该方案在业界采用的比较少;

市面上采用的较多的hive的跨集群数据同步,是对hive的元数据和数据分别进行数据同步;

对于 hive 数据的同步,本质上就是对于底层 hdfs 数据的同步,可以采用上述hdfs的distcp方案;

对于hive元数据的同步,本质上就是对底层 metastore db,如 mysql/posggresql 等rdbms中的数据的同步,可以采用成熟的 mysqldump 和 source方案。

8 常用命令总结

执行数据同步操作时,需要停止对目标目录的其它写操作;

当没有对原目录的写操作时(即停止了对源目录的写操作),可以使用以下命令来跨集群同步数据:hadoop distcp -delete -update -pugpb -m 10 -bandwidth 5 hdfs://xx.xx/ hdfs://yy.yy/

当有对原目录的写操作时(即有对原目录的并发写操作),需要结合快照机制来同步数据:hadoop distcp -diff <from_snapshot> <to_snapshot> -update -pugpb

结合快照机制来同步数据时,有以下前提要求:

需要源目录下有指定的两个快照 from_snapshot 和 to_snapshot;

需要目标目录下有快照 from_snapshot;

需要目标目录在前期制作了 from_snapshot 快照后,没有新的文件写操作如 create/rename/delete (即要求目标目录的当前状态跟原目录的from-snapshot一致);

该命令执行完毕后,目标目录下并不会自动创建快照 to_snapshot,如果后续还需要基于快照来做增量同步,需要手工在同步完毕后对目标目录制作快照 to_snapshot,为后续基于快照的同步(hadoop distcp -diff -update)做好准备;

!关注不迷路~ 各种福利、资源定期分享!欢迎小伙伴们关注公众号!

!欢迎小伙伴们添加眼睛大的棒球微信,备注“加群交流”,拉你加入ABC技术交流群!

IT眼睛大的棒球

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。