Hadoop集群间distcp方案探讨

转载:http://www.linezing.com/blog/?p=452

在日常的工作过程中,我们经常会碰到在不同的Hadoop集群间来回copy数据的需求。这些不同的集群,他们的Hadoop版本可能不同,不同机房的acl也可能不通,给我们的distcp带来了很多困难。这里整理曾经遇到的各种需求,供各位看官参考:

1.机房影响

这里假设有两个Hadoop集群,a和b,版本一致,但位于不同的机房A1和B1(A1的机器变化较少,B1的机器变化更频繁,acl推荐从A1打通到B1),任务计划于机房A1的机器gateway_a上提交。需要做的工作是:打通集群A1的所有机器,到集群B1的所有机器间的acl,主要包括:Namenode端口、jobtracker端口等

acl打通完成后,直接使用命令即可:

1
hadoop distcp -i  hdfs: //sourcename :<namenode_port> /URI_soure   hdfs: //destname :<namenode_port> /URI_dest

2.版本影响

同理,假设有两个集群c和d,c的版本为0.20.2,d的版本为0.19.1,我们需要把c的数据传输到d上。想实现这个需求,推荐的方案为:

任务提交到集群d上,gateway_d能够访问集群c的nn、jt、dfs http等端口,命令如:

1
hadoop distcp -i  hftp: //sourcename :50070 /URI_soure   hdfs: //destname :<namenode_port> /URI_dest

这里,需要额外关注的是,从0.20开始,hadoop修改了它的rpc协议,导致提交到0.20的jobtracker的distcp任务,是无法写入到0.19版本的集群的,如果想做distcp操作,任务必须启动在0.19版本的集群上。

3.机房和版本的共同影响

这种情况,综合上述两种操作即可,首先,我们需要做集群间的acl,考虑源和目标集群哪个的变动更频繁,来决定开通acl的方向;acl搞定后,接着步骤2执行就行。相信各位聪明的看官,就不再赘述了。

最后的最后,补充遇到过的一种复杂情形:有集群e(0.20)/f(0.19)/g(0.19),其中e/f位于同一机房,g位于另外一个机房,f->g的acl已经打通,如果临时需要从e推送数据到g的话,可以考虑将job提交到f集群上,通过hftp的方式,将e的数据distcp到g上,实践可用,供紧急需求时参考。

备注:distcp的工作原理,请参考《Hadoop The Definitive Guide》 章节3.7


你可能感兴趣的:(c,hadoop,工作,集群,任务)