##yarn-site.xml官网配置说明地址:
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
1.问题描述:
使用distcp时指定源集群地址和目标集群地址时需要指定具体的ip,但是如果集群在nn主备切换之后命令会无法使用;解决办法是需要判断一下active nn;或者直接配置使用多个集群的namespaces
hadoop distcp -Dmapred.job.queue.name=root.userA -pb \
hdfs://192.168.1.1:9000/user/userA/source_path/source_file \
hdfs://192.168.100.1:9000/user/userA/dest_path
2.相关配置参数:
dfs.nameservices ##配置多个逻辑nameservice名;以逗号分隔
dfs.internal.nameservices
##配置属于本集群的nameservice;默认等于dfs.nameservices 的值
##根据上面两个参数的解释:
一般情况,某个ha集群只有一个nameservice,且dfs.nameservices只配置了自己集群的一个nameservice;该值刚好被dfs.internal.nameservices继承;因此实际本来就是由dfs.internal.nameservices控制本集群的nameservice就不存在问题;
配置两个ha集群互访时,则首先在dfs.nameservices配置上需要访问的所有nameservices,然后直接列举其他集群nameservice对应的信息(两个nn以及端口等信息);最后再配置dfs.internal.nameservices参数对应的本集群即可;
进一步地,如果一个ha集群有多个namespace(联邦模式下).dfs.nameservices还是配置所有需要识别的逻辑nameservice;然后dfs.internal.nameservices则可以配置上属于自己集群的多个nameservices用逗号分开;
另外,在core-site.xml中配置的当前客户端默认使用的nameservice:
vi core-site.xml
property>
<name>fs.defaultFS</name>
<value>hdfs://nameservice1</value>
</property>
3.具体配置举例
vi hdfs-site.xml
##dfs.nameservices配置了需要访问的两个namespace:ns1、ns8;接着直接配置需要使用逻辑名访问的ns8的相关配置信息;
##在dfs.internal.nameservices中配置本集群ns1,然后配置相关信息4.
<!-- services -->
<!-- local sevice and remote service -->
<property>
<name>dfs.nameservices</name>
<value>ns1,ns8</value>
</property>
<!-- remote namespace ns8 -->
<!-- service ns8 -->
<property>
<name>dfs.ha.namenodes.ns8</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns8.nn1</name>
<value>192.168.100.1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns8.nn2</name>
<value>192.168.100.2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns8.nn1</name>
<value>192.168.100.1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns8.nn2</name>
<value>192.168.100.2:50070</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns8</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- local namespace ns1 -->
<!-- service ns1 -->
<property>
<name>dfs.internal.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>dev01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>dev02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>dev01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>dev02:50070</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
4.验证
##配置之后,可以使用命令验证:
hadoop fs -ls /
hadoop fs -ls hdfs://ns1/ ##访问客户端默认的集群
hadoop fs -ls hdfs://ns8/ ##访问ns8集群
然后distcp命令可以如下简化;并且不用关心主备是否切换。
hadoop distcp -Dmapred.job.queue.name=root.userA -pb \
hdfs://ns1/user/userA/source_path/source_file \
hdfs://ns8/user/userA/dest_path