如何通过外部hadoop集群Spark中的H/A名称节点组成的URI访问hdfs?
现在我有了一些Spark应用程序,它们将输出存储到HDFS 由于我们的hadoop集群由namenode H/A组成,而spark集群位于hadoop集群之外(我知道这很糟糕),所以我需要为应用程序指定HDFS URI,以便它可以访问HDFS 但它不能识别名称服务,所以我只能给出一个namenode的URI,如果失败,修改配置文件并重试 访问Zookeeper以显示活动似乎很烦人,所以我想避免如何通过外部hadoop集群Spark中的H/A名称节点组成的URI访问hdfs?,hadoop,apache-spark,hdfs,Hadoop,Apache Spark,Hdfs,现在我有了一些Spark应用程序,它们将输出存储到HDFS 由于我们的hadoop集群由namenode H/A组成,而spark集群位于hadoop集群之外(我知道这很糟糕),所以我需要为应用程序指定HDFS URI,以便它可以访问HDFS 但它不能识别名称服务,所以我只能给出一个namenode的URI,如果失败,修改配置文件并重试 访问Zookeeper以显示活动似乎很烦人,所以我想避免 您能推荐一些替代方案吗?假设您的名称服务是“hadoop测试”,然后按如下所示设置hadoop配置。
您能推荐一些替代方案吗?假设您的名称服务是“hadoop测试”,然后按如下所示设置hadoop配置。 您可以从启用HA的远程hdfs的hdfs-site.xml文件中获取这些信息
sc.hadoopConfiguration.set("dfs.nameservices", "hadooptest")
sc.hadoopConfiguration.set("dfs.client.failover.proxy.provider.hadooptest", "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider")
sc.hadoopConfiguration.set("dfs.ha.namenodes.hadooptest", "nn1,nn2")
sc.hadoopConfiguration.set("dfs.namenode.rpc-address.hadooptest.nn1", "10.10.14.81:8020")
sc.hadoopConfiguration.set("dfs.namenode.rpc-address.hadooptest.nn2", "10.10.14.82:8020")
在此之后,您可以将URL与“hadooptest”一起使用,如下所示
test.write.orc("hdfs://hadooptest/tmp/test/r1")
查看更多信息
我遇到了类似的问题。在我的例子中,我拥有启用HA的环境的主机列表,但在“活动”节点上方没有任何信息 为了解决这个问题,我使用了webhdfs调用来获取每个节点的状态,这就是我在代码中使用的webhdfs调用- 卷曲“ 我用不同的HDFS主机打上述电话。它返回json输出中每个节点的“状态”,如下所示
{
"..." : [ {
"name" : "Hadoop:service=NameNode,name=NameNodeStatus",
"modelerType" : "org.apache.hadoop.hdfs.server.namenode.NameNode",
"State" : "active",
.......
} ]
}
如果节点处于备用状态,您将获得“状态”:“备用”
一旦获得JSON,您就可以解析JSON并获得状态值。如果您想将H/a HDFS集群作为默认配置(大多数情况下),该配置适用于通过
spark submit
或spark shell
启动的每个应用程序。您可以将集群信息写入spark defaults.conf
sudo vim $SPARK_HOME/conf/spark-defaults.conf
并添加以下行。假设您的HDFS群集名称为HDFS-k8s
spark.hadoop.dfs.nameservices hdfs-k8s
spark.hadoop.dfs.ha.namenodes.hdfs-k8s nn0,nn1
spark.hadoop.dfs.namenode.rpc-address.hdfs-k8s.nn0 192.168.23.55:8020
spark.hadoop.dfs.namenode.rpc-address.hdfs-k8s.nn1 192.168.23.56:8020
spark.hadoop.dfs.client.failover.proxy.provider.hdfs-k8s org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
当您的下一个应用程序启动时,它应该可以工作
sc.addPyFile('hdfs://hdfs-k8s/user/root/env.zip')
您可以使用活动名称节点URI进行连接。应该是这样的:hdfs://hostname:8020Sorry 但我已经做到了。我想知道如何在不手动显示的情况下查找活动名称节点。http://:50070/dfshhealth.jsp。在这里,您将获得处于活动状态的。您也可以使用此命令
hadoop dfsadmin-report
来获取状态。感谢您提供更多信息,但我试图避免“手动”泄露。Spark应用程序应该自动找到活动的namenode。它应该是2>>,这样它就不会覆盖整个文件
sc.addPyFile('hdfs://hdfs-k8s/user/root/env.zip')