从两个HDFS集群之间拷贝数据命令
1 distcp命令
命令如下:
hadoop distcp hdfs://a01:8020/lime/ hdfs://nameservice/
该命令在需要数据的集群上面进行执行,执行过程需要跑MR程序。
有的时候我在其他节点上需要数据,同时我需要的是把数据从hdfs上面下载下来,以前我的方式是通过 distcp拷贝其他集群的数据.。 然后去本地集群上通过hdfs 的get
命令下载。然而这样做有一个弊端 相当于数据需要拷贝两遍,一遍为从一个集群拷贝到另一个集群,另一边为从本地集群get
获取。
为了避免这种方式,我想了一下,集群之间namenode的连接是通过某一个端口完成的,那么在本地集群去连接另一个集群的端口会不会下载的就是另一个集群的数据呢?
于是我亲身测试了一下。答案是肯定的 所以有了方法二
get 命令跨集群复制到本地
这里我以随便一个局域网IP为例,它上面配置的namenode通信端口为8020
nohup hadoop/bin/hdfs dfs -get hdfs://192.168.0.1:8020/lime/test ./ &
该命令即可把192.168.0.1主机的/lime/test目录下内容拷贝到本地。
也去你会遇到一些错误,比如:
Operation category READ is not supported in state standby. Visit https://s.apache.org/sbnn-error
那么你遇到就对了,因为我也遇到了。 原因是你拷贝数据的集群是高可用的,但是你去连接的时候却没有连接到active的namenode 。因此你可以去存储数据的集群上面查看哪一个namenode是可以active状态的。
查看namenode状态命令
[bigdata@f1 bigdata]$ hadoop/bin/hdfs haadmin -getServiceState namenode1
active
[bigdata@f1 bigdata]$ hadoop/bin/hdfs haadmin -getServiceState namenode2
standby
这时候你就需要把IP该为active状态的namenode的IP地址了,然后再尝试一下。你就可以成功了。