在上一节中,我们的 OSD 可以单向信任访问 OSC,之所以只做了单向访问,是因为 OSD 是我们的生产主要集群,不方便重启,OSC 相较之下不是那么重要。

OSD –> OSC

虽然是单向信任,实际上也可以达到 OSC 集群访问 OSD 的目的。

  1. 正常情况是,OSD 的凭据可以访问 OSC
  2. 在 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

参考:

https://community.cloudera.com/t5/Support-Questions/Problem-when-Distcp-between-two-HA-Cluster/td-p/216463

1
-Dmapreduce.job.hdfs-servers.token-renewal.exclude=

将两个集群的 nn 的 ip 地址加到这个属性值中,逗号分隔

目的是,指示2个集群上的 RM 去跳过或执行 NN 节点的委托令牌重认证

Caused by: java.io.IOException: Couldn’t run retriable-command

1
2
3
4
5
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
at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:101)
at org.apache.hadoop.tools.mapred.CopyMapper.copyFileWithRetry(CopyMapper.java:296)
... 10 more
Caused by: java.io.IOException: Check-sum mismatch between hdfs://<REDACTED>/20220331/13/<REDACTED>_2022033113_20220331130307_<REDACTED>.dat and hdfs://<REDACTED>:8020/<REDACTED>/20220331/30/.distcp.tmp.attempt_1642595741320_786418_m_000088_2. Source and target differ in block-size. Use -pb to preserve block-sizes during copy. Alternatively, skip checksum-checks altogether, using -skipCrc. (NOTE: By skipping checksums, one runs the risk of masking data-corruption during file-transfer.)

可能是前一次拷贝中断,导致目的文件和源文件的 checksum 不一致

使用 -pb 在拷贝过程中保持 block-size

参考:

https://community.cloudera.com/t5/Support-Questions/not-able-to-distcp-from-insecure-cluster-to-secure-cluster/td-p/202187

https://docs.cloudera.com/cdp-private-cloud-base/7.1.4/replication-manager/topics/rm-dc-kerbs-distcp-secure-clstrs-wout-xrealm-auth.html