hadoop distcp

hadoop distcp

使用:distcp  src dst
1.要求两个集群有相同的用户名,且此用户的密码也相同
2.配置/etc/hosts,使两个集群的每个结点都包含所有其它机器的主机名到ip的对应信息
3.如果两个集群用户不一样,则可以在一个集群上新建用户,与创建第一个hadoop用户一样:
(1)创建用户
举例:groupadd hadoop
useradd -g hdoop hadoop
passwd   hadoop
(2)配置ssh无密码登陆
ssh-keygen -t rsa,然后一直回车
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 644 authorized_keys

(3)安装配置与第一个hadoop用户相同的hadoop包
4. 拷贝
例子:
1.两个集群是相同的版本(也可以用第二种方式)
hadoop distcp  hdfs://nn1:9000/path1 hdfs://nn2:54310/path2
2.两个集群是不同hadoop版本
hadoop distcp  hftp://nn1:50070/path1 hdfs://nn2:54310/path2


其中9000为源集群的hdfs端口,50070为源集群的web监控端口,54310为目标集群的hdfs端口。

5. 注意
源src需要用户有读权限,而dst要求用户有写权限
nn1:9000这个地址必须和fs.default.name的配置一样,如果一个是主机名一个是IP地址,这样也可能不行

通过distcp可以实现在两个hadoop集群中同步数据,当两个hadoop集群的版本相同的时候比较简单,直接执行就可以了,比如:
hadoop distcp hdfs://192.168.0.138:9000/sunwg hdfs://192.168.0.139:9000/sunwg
执行时,会在启动mapreduce进行文件的拷贝,最后138上的sunwg下的文件全部会拷贝到139下面的sunwg下。
如果两个hadoop集群的hadoop版本不一致,就稍微会麻烦些。因为不同版本的hadoop是没有办法通过hdfs的协议直接访问的,此时需要采用hftp的方式。hftp是hadoop的一种只读的文件访问协议,没有办法进行更新。所以此时,如果想把0.19上的数据同步到0.20上,那么此时distcp要在对0.20有写权限的机器上发起;反之,要在0.19的机器上启动。比如:
hadoop distcp hftp://192.168.0.159:50070/sunwg hdfs://192.168.0.128:9000/sunwg/test01
这样就可以跨hadoop的版本来拷贝数据。

另,我测试是在虚拟机上进行的,所有的虚拟机都是一台虚拟机复制得到的,所有的虚拟机的hostname都是一样的,所以昨天测试的时候一直有问题,通过hftp访问具体文件的时候有下面的错误:
[hadoop@hadoop01 ~]$ hadoop fs -cat hftp://192.168.0.159:50070/sunwg/1.dat
Invalid input[hadoop@hadoop01 ~]$
一直报的Invalid input。这样的话使用distcp同步数据也是有问题的。后来修改了hostname,两台机器的名字不一样,错误就消失了。

你可能感兴趣的:(hadoop,distcp)