在上一节中,我们的 OSD 可以单向信任访问 OSC,之所以只做了单向访问,是因为 OSD 是我们的生产主要集群,不方便重启,OSC 相较之下不是那么重要。
OSD –> OSC
虽然是单向信任,实际上也可以达到 OSC 集群访问 OSD 的目的。
- 正常情况是,OSD 的凭据可以访问 OSC
- 在 OSC 集群的接口服务器(客户端环境配置的是 OSC)上,专门设立一个用户,使用 OSD 的 keytab 进行 kinit,变相达到 OSC 访问 OSD。
那么两个可以访问的 hdfs 可以互相拷贝了
拷贝命令
参考官方文档
https://hadoop.apache.org/docs/stable/hadoop-distcp/DistCp.html#Update_and_Overwrite
参考命令:1
/bin/hadoop distcp -Dmapreduce.job.hdfs-servers.token-renewal.exclude=<namenode ip1>,<namenode ip1> -Dipc.client.fallback-to-simple-auth-allowed=true -Dmapreduce.job.queuename=default -m 140 -pb -skipcrccheck -update -filters /data/filters.txt /path/to/file hdfs://<active namenode ip>:8020/path/to/file
参数说明:
- 设置资源队列
mapred.job.queue.name=default
- 由于使用了kerberos认证,需要设置改属性
ipc.client.fallback-to-simple-auth-allowed=true
- m
表示启用多少map,最大的同时拷贝数量
- pb
保持 block size
- skipcrccheck
跳过 crc 校验,拷贝速度更快
- update
拷贝的模式是 update
仅当目标文件和源文件的 size, blocksize 或者 checksum 不同时覆盖
- filters
使用正则排除文件,这个参数指定的是包含正则的文件位置
比如要排除 .tmp 的文件1
.*\.tmp
可以写多行,进行多个文件规则的排除,详见参考
https://cloudera.ericlin.me/2016/01/how-to-use-filters-to-exclude-files-when-in-distcp/
常见报错
Failed to renew token: Kind: HDFS_DELEGATION_TOKEN
1 | Failed to renew token: Kind: HDFS_DELEGATION_TOKEN |
参考:
1 | -Dmapreduce.job.hdfs-servers.token-renewal.exclude= |
将两个集群的 nn 的 ip 地址加到这个属性值中,逗号分隔
目的是,指示2个集群上的 RM 去跳过或执行 NN 节点的委托令牌重认证
Caused by: java.io.IOException: Couldn’t run retriable-command
1 | Caused by: java.io.IOException: Couldn't run retriable-command: Copying hdfs://<REDACTED>/20220331/13/<REDACTED>_2022033113_20220331130307_<REDACTED>.dat to hdfs://<REDACTED>:8020/apps/5G_N1N2/20220331/30/<REDACTED>_2022033113_20220331130307_<REDACTED>.dat |
可能是前一次拷贝中断,导致目的文件和源文件的 checksum 不一致
使用 -pb 在拷贝过程中保持 block-size
参考: