HDFS跨集群(Insecure To Secure)数据迁移实战
Posted DigNew
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS跨集群(Insecure To Secure)数据迁移实战相关的知识,希望对你有一定的参考价值。
背景
最近新搭建了一套CDH集群B(启用了Kerberos),需要将原集群A中的数据迁移到集群B中。
尝试
首先想到的是通过distcp命令在两个集群中进行数据传输,二话不说,执行命令:
hadoop distcp hdfs://hadoop1:8020/user/hive/warehouse/* /user/hive/warehouse/
NO,出现异常:
...
Caused by: java.io.IOException: Server asks us to fall back to SIMPLE auth, but this client is configured to only allow secure connections.
at org.apache.hadoop.ipc.Client$Connection.setupiostreams(Client.java:786)
at org.apache.hadoop.ipc.Client$Connection.access$3000(Client.java:396)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1557)
at org.apache.hadoop.ipc.Client.call(Client.java:1480)
... 31 more
看来如果两个集群都没有做安全认证的话,可以直接通过distcp进行数据迁移。
但是现在其中一个集群(集群B)启用了Kerberos,,直接用distcp命令进行数据迁移出现问题。那该怎么办呢?
漫长的查资料过程。。。
解决
终于,在Cloudera的官网找到相关信息,( ̄▽ ̄)/
原来可以通过设置参数实现
在集群B(启用Kerberos)的HDFS的core-site.xml
配置文件中进行如下配置:
<property>
<name>ipc.client.fallback-to-simple-auth-allowed</name>
<value>true</value>
</property>
额,需要配置文件,可不可以不修改配置文件呢?
答案当然是可以的,可以在distcp
命令中加入上述配置即可。操作如下:
配置host
在集群B中所有节点上配置集群A所有机器的host
vim /etc/hosts
192.168.26.20 hadoop1
192.168.26.21 hadoop2
192.168.26.22 hadoop3
192.168.26.23 hadoop4
192.168.26.24 hadoop5
192.168.26.25 hadoop6
执行数据迁移
在集群B(启用Kerberos)其中一个节点上执行:
hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -m 30 webhdfs://hadoop1:50070/user/hive/warehouse/* /user/hive/warehouse/
执行成功( ̄▽ ̄)~*
再说说distcp常用参数:
-i:忽略失败。这个选项会比默认情况提供关于拷贝的更精确的统计, 同时它还将保留失败拷贝操作的日志,这些日志信息可以用于调试。最后,如果一个map失败了,但并没完成所有分块任务的尝试,这不会导致整个作业的失败。
-log:记录日志到logdir。
-m:同时拷贝的最大数据,指定拷贝数据时的map的数目。并不是map数越多越吞吐量越大。
-overwrite:覆盖目标。如果一个map失败并且没有使用-i选项,不仅仅那些拷贝失败的文件,这个分块任务中的所有文件都会被重新拷贝。 所以这就是为什么要使用-i参数。
-update:如果源和目标的大小不一样则进行覆盖。
*-delete:删除已经存在的目标文件,不会删除源文件。这个删除是通过FS Shell实现的。所以如果垃圾回收机制启动的话,删除的目标文件会进入trash。
-f:使用<urllist_uri>作为文源文件列表。
以上是关于HDFS跨集群(Insecure To Secure)数据迁移实战的主要内容,如果未能解决你的问题,请参考以下文章
USDP使用笔记打通双集群HDFS实现跨nameservice访问
USDP使用笔记打通双集群HDFS实现跨nameservice访问