我有两个hadoop集群,我的目标是使用hadoop -cp将所有hdfs文件从 cluster1 复制到 cluster2
Cluster1中: Hadoop 0.20.2-cdh3u4
Cluster2中: Hadoop 2.0.0-cdh4.1.1
现在,即使只是在 cluster2 上远程对 cluster1 运行dfs -ls命令,如下所示:
hadoop fs -ls hdfs://cluster1-namenode:8020/hbase
我得到了例外:
ls:本地异常失败:java.io.IOException:响应为空。主机详细信息:本地主机为:“cluster2-namenode / 10.21.xxx.xxx”;目标主机是:“cluster1-namenode”:8020;
我认为这是由于hadoop版本的差异,有没有解决方法呢?我的旧环境-集群1没有部署mapred,它排除了所有distcp,bhase copytable选项。并且cluster1上也没有hbase复制功能。我正在努力想办法将hdfs数据从 cluster1 迁移到 cluster2 ,因为每个人都在讨论将cdh3升级到cdh4而不是从3迁移到4。
答案 0 :(得分:1)
在cloudera cdh用户邮件主题中讨论了这个:
https://groups.google.com/a/cloudera.org/forum/?fromgroups=#!topic/cdh-user/GeT1RTbRVcw
总之,
CDH3和CDH4之间的常规DFS命令(如dfs -cp
)将不起作用,因为它们具有不同的协议版本(并且通过常规RPC调用彼此不兼容)。
Distcp可以用来复制hdfs数据交叉集群,甚至可以从cdh3复制到cdh4,但这里有一些先决条件:你需要在cdh4集群上运行distcp命令,cdh4集群需要有mapred部署/可用。 cdh3集群不一定需要mapred。
运行distcp命令时,不要使用hdfs作为源路径,使用hftp作为源路径,使用hftp作为目标路径(因为hftp是READ-ONLY,所以需要对目标路径进行写访问)所以命令看起来像:
hadoop distcp hftp://hadoop-namenode.cluster1/hbase hftp://hadoop-namenode.cluster2/hbase
答案 1 :(得分:1)
我对盛杰答案的经历中的一些注释:
它可以从CDH4和CDH3运行,重要的是该命令在目标集群上运行。
运行distcp
commnad时使用hftp
作为源,hdfs
作为目标(因为hftp只读!)所以命令如下:
hadoop distcp hftp://source.cluster1/path hdfs://destination.cluster1/path