hadoop - nameservice1 和 nameservice2 之间的 distcp

标签 hadoop bigdata cloudera cloudera-cdh cloudera-manager

我们有 CDH 5.2 和 Cloudera Manager 5。

我们要将数据从nameservice2复制到nameservice1

两个集群都在相同的 CDH 版本上

当我尝试 hadoop distcp hdfs://nameservice2/foo/bar hdfs://nameservice1/bar/foo

我遇到了错误

java.lang.IllegalArgumentException: java.net.UnknownHostException: nameservice2

所以我从 Nameservice2 添加了以下配置到 Nameservice1

Cloudera 管理器(网关默认组)中 hdfs-site.xml 的 HDFS 客户端高级配置片段(安全阀)

<property>
<name>dfs.nameservices</name>
<value>nameservices2</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.nameservices2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.namenodes.nameservices2</name>
<value>namenode36,namenode405</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameservices2.namenode36</name>
<value>hnn001.prod.cc:8020</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.nameservices2.namenode36</name>
<value>hnn001.prod.com:54321</value>
</property>
<property>
<name>dfs.namenode.http-address.nameservices2.namenode36</name>
<value>hnn001.prod.com:50070</value>
</property>
<property>
<name>dfs.namenode.https-address.nameservices2.namenode36</name>
<value>hnn001.prod.com:50470</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:8020</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:54321</value>
</property>
<property>
<name>dfs.namenode.http-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:50070</value>
</property>
<property>
<name>dfs.namenode.https-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:50470</value>
</property>

但我仍然遇到同样的错误。

有什么解决办法吗?

谢谢

最佳答案

在启用了 HA 的 HDFS namenode nameservice1 中,nameservice2 是逻辑名称,您不能将端口与该逻辑名称一起使用。

你有两种方法。

简单的方法是找到事件的名称节点并在 distcp 命令中使用事件的名称节点:端口,如下所示。 Namenode web UI 可用于查找两个集群的事件名称节点。

hadoop distcp hdfs://hnn001.prod.cc:8020:8020/foo/bar hdfs://<dest-cluster-active-nn-hostname>:8020/bar/foo

另一种方法是使用如下两个集群的逻辑名称,但在尝试以下命令之前,请确保您已在客户端 hdfs-site.xml 中正确配置了 nameservice1 和 nameservice2。

hadoop distcp hdfs://nameservice2/foo/bar hdfs://nameservice1/bar/foo

在本地集群中确认远程集群的名称服务。

看起来 nameservice2 是本地的,nameservice1 是远程的。您需要将 nameservice1 和 nameservice2 的所有关联属性保留在本地集群中,即。您本地集群的客户端 hdfs-site.xml 文件应如下所示。

<configuration>
<!-- Available nameservices -->
<property>
<name>dfs.nameservices</name>
<value>nameservices1,nameservices2</value>
</property>

<!-- Local nameservice2 properties -->
<property>
<name>dfs.client.failover.proxy.provider.nameservices2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.namenodes.nameservices2</name>
<value>namenode36,namenode405</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameservices2.namenode36</name>
<value>hnn001.prod.cc:8020</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.nameservices2.namenode36</name>
<value>hnn001.prod.com:54321</value>
</property>
<property>
<name>dfs.namenode.http-address.nameservices2.namenode36</name>
<value>hnn001.prod.com:50070</value>
</property>
<property>
<name>dfs.namenode.https-address.nameservices2.namenode36</name>
<value>hnn001.prod.com:50470</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:8020</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:54321</value>
</property>
<property>
<name>dfs.namenode.http-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:50070</value>
</property>
<property>
<name>dfs.namenode.https-address.nameservices2.namenode405</name>
<value>hnn002.prod.com:50470</value>
</property>

<!-- Remote nameservice1 properties -->
<!-- You can find these properties in the remote machine's hdfs-site.xml file -->

<property>
<name>dfs.client.failover.proxy.provider.nameservices1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.namenodes.nameservices1</name>
<value>namenodeXX,namenodeYY</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameservices1.namenodeXX</name>
<value><Remote-nn1>:8020</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.nameservices1.namenodeXX</name>
<value><Remote-nn1>:54321</value>
</property>
<property>
<name>dfs.namenode.http-address.nameservices1.namenode**XX**</name>
<value><Remote-nn1>:50070</value>
</property>
<property>
<name>dfs.namenode.https-address.nameservices1.namenodeXX</name>
<value><Remote-nn1>:50470</value>
</property>
<property>
<name>dfs.namenode.rpc-address.nameservices1.namenodeYY</name>
<value><Remote-nn2>:8020</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.nameservices1.namenodeYY</name>
<value><Remote-nn2>:54321</value>
</property>
<property>
<name>dfs.namenode.http-address.nameservices1.namenodeYY</name>
<value><Remote-nn2>:50070</value>
</property>
<property>
<name>dfs.namenode.https-address.nameservices1.namenodeYY</name>
<value><Remote-nn2>:50470</value>
</property>

<!-- Other properties --> 

</configuration>

在上面的配置文件中,用远程机器的 hdfs site.xml 中的相应值替换所有占位符,如 YY XX。

关于hadoop - nameservice1 和 nameservice2 之间的 distcp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26849308/

相关文章:

hadoop - HBase-0.98.8-hadoop2 中的 Hive-0.14.0 集成问题

获取时的 Apache Nutch 2.3.1 扩展点

hadoop - 如何有效地读取带有 spark 路径的文件,即想要返回 `wholeTextFiles` 的 `RDD[String, Iterator[String]]`

java - SQLContext.sql 上的 Spark NoSuchMethodError(Cloudera 5.8.0 上的 Spark 1.6.0)

mysql - 带日期的 Sqoop psql 查询

通过 Cloudera 管理器安装 Hadoop

matlab - 在 MATLAB 中从磁盘中抽取大型数据文件?

python - 将大量 .data 加载到数组中的最快方法

hadoop - hadoop 版本之间有什么区别?

scala - HDFS 文件系统的 URL