我是hdfs的新手。我正在编写可以连接数据并将数据写入远程hadoop集群的Java客户端。
String hdfsUrl = "hdfs://xxx.xxx.xxx.xxx:8020";
FileSystem fs = FileSystem.get(hdfsUrl , conf);
这很好用。我的问题是如何处理启用HA的hadoop集群。启用HA的hadoop群集将具有两个名称节点 - 一个活动的名称节点和备用名称节点。如何在运行时从客户端代码中识别活动的名称节点。
http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_system-admin-guide/content/ch_hadoop-ha-3-1.html具有关于可用于联系活动名称节点的java类的以下详细信息 dfs.client.failover.proxy.provider。[$ nameservice ID]:
This property specifies the Java class that HDFS clients use to contact the Active NameNode. DFS Client uses this Java class to determine which NameNode is the current Active and therefore which NameNode is currently serving client requests.
Use the ConfiguredFailoverProxyProvider implementation if you are not using a custom implementation.
例如:
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
如何在我的Java客户端中使用此类,或者是否有其他方法来识别活动的名称节点...
答案 0 :(得分:0)
不确定它是否是相同的上下文,但是给定一个hadoop集群,应该将core-site.xml(从集群中取出)放入应用程序类路径或hadoop配置对象(org.apache.hadoop.conf.Configuration)
中,然后访问该文件使用网址"hdfs://mycluster/path/to/file"
,其中mycluster
是hadoop群集的名称。像这样我已经成功地从spark应用程序中的hadoop集群中读取了一个文件。
答案 1 :(得分:0)
您的客户端应具有hadoop集群的hdfs-site.xml,因为其中将包含用于两个名称节点的 nameservice 以及有关两个名称节点的主机名,连接端口等信息。< / p>
您必须按照(https://stackoverflow.com/a/39445389/2584384)的答案在客户端中设置这些conf:
"dfs.nameservices", "hadooptest"
"dfs.client.failover.proxy.provider.hadooptest" , "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
"dfs.ha.namenodes.hadooptest", "nn1,nn2"
"dfs.namenode.rpc-address.hadooptest.nn1", "10.10.14.81:8020"
"dfs.namenode.rpc-address.hadooptest.nn2", "10.10.14.82:8020"
因此,您的客户端将使用类“ org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider” 查找哪个活动的namenode,并将相应的请求重定向到该namenode。它基本上首先尝试连接到第一个uri,如果连接失败,然后尝试连接第二个uri。