版本:hadoop2.7.7
一、关于集群间数据同步
- 集群间数据同步,可以从原集群推送数据到目标集群,此时会为会占用原集群 yarn 中的资源;
- 集群间数据同步,也可以从目标集群发起作业,主动拉取原集群的数据,此时消耗的是目标集群的yarn资源;
- 如果原集群是生产集群,一般在目标集群执行命令hadoop distcp来发起作业,通过拉的方式来同步数据,此时不会消耗原集群即生产集群的yarn资源;
- 当原集群和目标集群大版本不同时,(比如在 hadoop 1.x 跟 hadoop 2.x 之间同步数据),需要使用 webhdfs 协议,即通过以下格式指定远端集群:webhdfs://<namenode_hostname>:<http_port>;(当然,既可以从原集群推数据,也可以从目标集群拉数据);
- 当原集群和目标集群大版本相同时,(比如都是 hadoop 2.x或都是hadoop 3.x),推荐使用 hdfs 协议,此时性能比 webhdfs 更好;
- 如果 webhdfs 配置了 ssl 加密,则需要使用协议 “swebhdfs://” ;
二、前提条件:
- 源集群和目标集群的 namenode 都是高可用的,且在不同的服务器上运行。
- 源集群和目标集群都已经安装了 hadoop,并配置了相应的参数和组件,例如 hdfs、yarn、mapreduce 等。
- 迁移之前需要把两个集群的所有节点都互通/etc/hosts文件(重要,包括各个数据节点)
- 源集群和目标集群之间的网络连接可靠,且支持 ssh 和 rpc 等通信协议。同时需要确保端口号设置和防火墙策略等安全措施符合要求。
- 在进行数据复制和同步操作前,应该进行一次充分的测试,并检查日志和错误信息,以确保操作的正确性和完整性。
- 由于迁移数据运行了mr任务,对集群资源有一定的消耗。
四、关于开启了 kerberos 安全认证后的数据同步
-
如果原集群和目标集群都启用了kerberos认证 (hadoop.security.authentication=kerberos),需要首先做 kerberos 的 realm 互信,然后才能通过推或拉的方式执行 dictcp 进行数据同步;
-
如果原集群与目标集群一个启用了kerberos认证,另一个没有启用kerberos认证,为简单起见,可以在启用了kerberos认证的集群中执行distcp,通过推或拉的方式进行数据同步;
五、具体命令:
如果两个 hadoop 集群的 namenode 都是高可用的,可以使用 distcp 命令进行数据复制和同步。具体命令如下:
hadoop distcp [options] <srcurl> <desturl>
其中,[options]
是可选的参数,<srcurl>
和 <desturl>
分别是源和目标文件系统的 url。
假设源集群名称为 src_cluster
,目标集群名称为 dst_cluster
,则可以使用以下命令复制源集群中的数据到目标集群:
hadoop distcp -update -skipcrccheck -delete -bandwidth 50 -m 100 -mapredsudo hdfs://src_cluster/user/hadoop/example hdfs://dst_cluster/user/hadoop/backup
命令中使用了以下参数:
-update
:只复制更新时间较新的文件;-skipcrccheck
:跳过 crc 校验;-delete
:删除目标集群中比源集群中旧或不存在的文件或目录;-bandwidth 50
:限制最大带宽,以避免过多的网络流量阻塞;-m 100
:设置最大 mapper 数量;-mapredsudo
:启用兼容模式。
六、集群名称之间识别配置:
在使用 distcp 进行跨集群数据复制和同步时,需要确保源集群和目标集群之间可以相互访问并识别。通常情况下,需要在源集群和目标集群的 hadoop 配置文件中进行相应的配置,以便于两个集群之间建立连接。
具体来说,可以将目标集群的 namenode 或 resourcemanager 的 ip 地址和端口号添加到源集群的 core-site.xml
和 hdfs-site.xml
配置文件中。例如,在源集群中添加目标集群的 namenode 地址和端口号的配置如下:
<property>
<name>fs.defaultfs</name>
<value>hdfs://src_cluster:8020,hdfs://dst_cluster:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.dst_cluster</name>
<value>node2:8020</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.dst_cluster</name>
<value>node2</value>
</property>
上述示例中,
-
fs.defaultfs
属性为源集群和目标集群的 namenode url。 -
dfs.namenode.rpc-address.dst_cluster
属性指定了目标集群的 namenode 地址和端口号。 -
yarn.resourcemanager.hostname.dst_cluster
属性则指定了目标集群的 resourcemanager 主机名。这些参数可以根据实际情况进行相应的修改和调整。 -
在配置好集群之后,可以通过
hdfs dfsadmin -report
命令来检查 hdfs 的状态,并查看集群是否能够正常运行并连通。 -
如果所有组件都正常启动,则可以使用 distcp 命令进行跨集群数据复制和同步操作。
七、distcp优势特性
- 带宽限流
- distcp是支持带宽限流的,使用者可以通过命令参数bandwidth来为程序进行限流,原理类似于hdfs中数据balance程序的限流.
- 增量数据同步
- 对于增量数据同步的需求,在distcp中也得到了很好的实现.通过update,append 和 diff 2个参数能很好的解决.官方的参数使用说明:
- 高效的性能
-
执行的分布式特性
-
高效的mr组件
八、distcp 的底层工作机制
新版 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 的重要参数讲解
distcp 提供了多种参数,来控制拷贝任务的各种细节,经常使用到的关键参数有 -update, -delete, -overwrite, -m, -bandwidth,-diff,-p,-i 等:
-
-m <num_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 上不同的文件;
-
-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
-
参数 -skipcrccheck 的意思是 “whether to skip crc checks between source and target paths.”,即是否跳过原路径和目标路径下文件的 crc 校验(crc:cyclic redundancy check)。
-
如果指定了该参数,会跳过crc校验,同步作业速度会快些;
-
但指定该参数后,由于不校验 crc,而是通过文件名和文件大小来发现哪些文件需要进行同步,在极端情况下,可能会漏掉某些需要同步的小文件,比如某些只有少数几条记录的小文件,从而造成数据不一致;
十一、常用命令总结
- 执行数据同步操作时,需要停止对目标目录的其它写操作;
- 当没有对原目录的写操作时(即停止了对源目录的写操作),可以使用以下命令来跨集群同步数据: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)做好准备;
发表评论