大家好,我是明哥!最近有朋友问起hadoopdistcp的使用,但是我不是很清楚一些容易踩的细节和陷阱,所以今天我们就来看看hadoopdistcp的原理、细节和陷阱。1.DistCp概述我们知道大数据集群内部有节点级和机架级的容错机制(存储层对应传统的三副本或纠删码机制),但是对于一些数据安全需求变化的场景,比如在金融行业两地三中心的典型场景中,经常会有跨地域、跨集群的容灾需求,这就涉及到跨集群的数据同步。DistCp(分布式副本)是一个跨集群的数据同步工具。DistCp可用于hdfs集群内或集群间的大规模数据同步。由于底层使用MapReduce框架,通过多个mapper复制待复制文件列表,其性能可与hdfsdfs-get/put等媲美。通过本地文件系统传输的数据同步方案为效率更高,速度更快。同时,由于DistCp可以跨hdfs各大版本同步数据,新版DistCp(distcpversion2)相比旧版DistCp(legacyDistCp,version1.2.1)在很多方面进行了优化和改进),所以大规模的数据同步,不管是集群内还是集群间,首选方案是DistCp。很多商用的hdfs数据同步方案底层都是原生的DistCp,比如cdh的bdr工具,比如tdh的备份工具,原理都是一样的。2.关于集群间数据同步。集群间数据同步可以将数据从原始集群推送到目标集群。这时候,原clusteryarn中的资源就会被占用;集群间数据同步也可以从目标集群发起作业,主动拉取原集群的数据,此时消耗目标集群的YARN资源;如果原集群是生产集群,一般会在目标集群上执行命令hadoopdistcp启动作业,拉取同步数据,此时原集群不会被消费。cluster是生产集群的YARN资源;当原集群和目标集群的主版本不同时(比如hadoop1.x和hadoop2.x同步数据),需要使用webhdfs协议,即指定远程集群,格式如下:webhdfs://:;(当然,既可以从原集群push数据,也可以从目标集群pull数据);当原集群和目标集群的大版本相同时,(比如都是hadoop2.3.x),推荐使用hdfs协议,此时性能优于webhdfs;如果webhdfs配置了SSL加密,则需要使用协议“swebhdfs://”;3、关于开启kerberos安全认证后的数据同步,如果原集群和目标集群都开启了kerberos认证(hadoop.security.authentication=kerberos),需要先做kerberosrealm互信,然后就可以了通过push或pull的方式执行dictcp进行数据同步;如果原始集群和目标集群都开启了kerberos认证,另一个集群没有开启kerberos认证,为了简单起见,可以在开启kerberos认证的集群中执行distCp,通过push或者pull的方式进行数据同步;4.DistCp底层工作机制新版本的DistCp底层有以下组件,它们各自的职责如下:DistCpDriver:负责解析DistCp命令行参数,编排协调具体的复制任务(首先调用copy-listing-generator获取要复制的文件列表,然后配置并提交Map-Reduce复制任务,最后根据配置项,返回MR任务句柄并启动,或者等待MR结束任务执行;)复制列表生成器:负责解析给定的源路径(目录或文件,可以包含通配符),生成要复制的文件/目录列表,并输出到SequenceFile;Input-formatsandMap-Reduce:负责读取Copy-listinggenerator生成的SequenceFile中待烘焙文件列表,并执行实际的文件拷贝;5.DistCp的重要参数说明DistCp提供了多种参数来控制复制任务的各种细节。经常使用的关键参数有-update、-delete、-overwrite、-m、-bandwidth、-diff、-p、-i等:-m:控制map任务的最大数量;(实际的map任务数不会大于要复制的文件数;map数多不一定会增加OverallIOthroughput);-bandwidth:控制每个map任务可用的最大带宽,单位MB;-p[rbugpcaxt]:控制是否保留源文件的属性,rbugpcaxt指的是:replicationnumber,blocksize,user,group,permission,checksum-type,acl,xattr,andtiemstamp;skipcrccheck:控制在检查源文件和目标文件差异时是否跳过CRC校验,生成待复制文件列表;update:如果源目录和目标目录下的文件的文件大小/blocksize/checksum有差异,则使用;-update:复制目标目录中不存在但源目录中存在的文件,或目标目录与源目录的文件大小/块大小/校验和不同的文件;-覆盖:覆盖目标目录下的同名文件(如果map任务执行失败,不指定-i参数,则所有要复制的文件,包括复制失败的文件,都会重新复制);-i:忽略复制过程中部分MAP任务的错误,继续执行剩余的地图复制任务,而不是直接让整个作业失败;(默认情况下,如果一个map任务失败次数达到mapreduce.map.maxattempts,所有未完成的map任务将被杀死;);-delete:删除目标目录中存在但源目录中不存在的文件;该参数只能与-update或-overwrite结合使用;-diff和-rdiff:控制是否结合使用快照机制,根据两次快照的差异(snapshotdiff)来确定要复制的文件列表,需要注意以下几点:-diff和-rdiff需要与选项-update一起使用;-diff和-rdiff不能和-delete一起使用,否则会报错:java.lang.IllegalArgumentException:-deleteand-diff/-rdiffaremutuallyexclusive。-delete选项将被忽略;该命令执行前提:源目录下有from_snapshot和to_snapshot两个指定快照;该命令的前提条件:要求目标目录下有快照from_snapshot;该命令前提:前期在target目录做from_snapshot快照后,没有新的文件写入操作(create、rename、delete);命令执行后,目标目录不会自动创建快照to_snapshot。如果以后需要基于快照做增量同步,同步完成后需要手动创建目标目录的快照to_snapshot,为后续基于快照的同步做准备(hadoopdistcp-diff-update);6.容易踩坑-skipcrccheck参数-skipcrccheck意思是“是否跳过CRCchecksbetweensourceandtargetpaths.”,即是否跳过原路径和目标路径下文件的crc校验(CRC:CyclicRedundancyCheck)。如果指定该参数,将跳过crc校验,同步操作会更快一些;但是指定了这个参数之后,因为不校验crc,而是通过文件名和文件大小找到需要同步哪些文件。在极端情况下,可能会漏掉一些需要同步的小文件,比如一些只有几条记录的小文件,导致数据不一致;下图显示两个hiveorc表只有一条记录,对应的HDFS文件比较小,都是299BYTE。指定参数skipcrccheck进行同步操作文件省略时,源目录和目标目录的数据不一致:"sudo-uhdfshadoopdistcp-update-delete-skipcrccheck-pugpbhdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scphdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scp2":skipcrccheckpit-hdfsskipcrccheckpit-hivesql7。关于Hive的跨集群数据同步关于Hive的跨集群数据同步,Hive社区正在推广Hive复制方案,但是由于该方案的各种前提条件和局限性,该方案目前在业界使用较少;市场上使用的hive的跨集群数据同步是分别同步hive的元数据和数据的数据同步;hive数据的同步本质上是底层hdfs数据的同步,可以使用上述hdfs的distcp方案;hive元数据的同步本质上是底层的metastoredb,比如mysql/posggresql等RDBMS的数据同步,可以使用成熟的mysqldump和source方案。8、常用命令总结在进行数据同步操作时,需要停止其他对目标目录的写操作;当原目录没有写操作时(即停止对源目录的写操作),可以使用如下命令跨集群同步数据:hadoopdistcp-delete-update-pugpb-m10-bandwidth5hdfs://xx.xx/hdfs://yy.yy/当有对原目录的写操作时(即有并发的对原目录的写操作),需要结合快照机制同步数据:hadoopdistcp-diff-update-pugpb结合快照机制同步数据时,需要满足以下条件:源目录下必须有from_snapshot和to_snapshot两个指定快照;有快照from_snapshot;要求目标目录前期from_snapshot快照后,不会再有create/rename/delete等新文件写入操作(即要求目标目录当前状态一致使用原始目录的快照);命令执行后,不会在目标目录下自动创建快照to_snapshot。如果以后需要基于快照做增量同步,同步完成后需要在目标目录手动创建快照to_snapshot,为后续基于快照的同步(hadoopdistcp-diff-update)做好准备
