公司以前的hadoop集群是1.X,新到的机器全部安装了CDH5版本的hadoop2.X集群,这就需要把1.X的数据迁移到2.X上。
最笨的办法就是在1.X的机器上hadoop dfs -get **** scp hadoop dfs -put或者hadoop dfs -scp
但是这样很慢,我们有25T的数据,所以需要更快的办法,最后发现原来hadoop有distcp命令,原理是通过mapreduce来转移数据,
其中遇到了一些问题,记录如下:
1. 需要把两个集群的所有节点都互通/etc/hosts文件,大概如下:
10.40.2.41 hz01-cs-app002041
10.40.2.42 hz01-cs-app002042
10.40.2.23 hz01-cs-app002023
10.40.2.24 hz01-cs-app002024
10.40.2.25 hz01-cs-app002025
10.40.2.26 hz01-cs-app002026
(以上是老集群的)
10.40.22.15 hz01-cs-app022015
10.40.22.16 hz01-cs-app022016
10.40.22.17 hz01-cs-app022017
10.40.22.18 hz01-cs-app022018
10.40.22.19 hz01-cs-app022019
(以上是新集群的)
2. 由于版本不同,不能用hdfs协议直接考,需要用http协议。
即不能用 distcp hdfs://src:50070/foo /user**
而要用 distcp hftp://src:50070/foo /user**
3. Caused by: java.io.IOException: Check-sum mismatch between hftp://src:50070/foo/yyy.yy and hdfs://dst:54310/foo/xxx.xx
网上搜了半天,这个问题发生的概率真是太小,几乎没有人问。
后来终于在cloudera的网站上找到了解决方法:
最终的命令为:
hadoop distcp hftp://10.4.2.41:50070/user/hive/warehouse/tables/ufanode_nginx_pv /user/hive/warehouse/tables/