现在我有一些Spark应用程序将输出存储到HDFS。
由于我们的hadoop集群由namenode H / A组成,而spark集群在hadoop集群之外(我知道它不好)我需要为应用程序指定HDFS URI,以便它可以访问HDFS。
但它不能识别名称服务,因此我只能给出namenode的URI之一,如果失败,请修改配置文件并重试。
访问Zookeeper以显示活动似乎非常烦人,所以我想避免。
你能提出任何其他选择吗?
答案 0 :(得分:5)
假设您的姓名服务是' hadooptest',然后设置如下的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")
在此之后,您可以将网址与' hadooptest'如下。
test.write.orc("hdfs://hadooptest/tmp/test/r1")
检查here以获取更多信息。
答案 1 :(得分:1)
如果要将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')
答案 2 :(得分:0)
e.g。
echo "HADOOP_CONF_DIR=\"/opt/hadoop/etc/hadoop\"" > spark-env.sh
答案 3 :(得分:0)
我遇到了类似的问题。在我的情况下,我有HA启用环境的主机列表,但没有关于" Active"节点。
要解决这个问题,我使用 webhdfs 调用来获取每个节点的状态,这是我在代码中使用的webhdfs调用 -
curl' http://[hdfsHost]:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus'
我使用不同的HDFS主机拨打以上电话。它返回"状态" json输出中的每个节点,如下所示
{
"..." : [ {
"name" : "Hadoop:service=NameNode,name=NameNodeStatus",
"modelerType" : "org.apache.hadoop.hdfs.server.namenode.NameNode",
"State" : "active",
.......
} ]
}
如果节点待命,您将获得" State" :"待机"
获得JSON后,您可以解析json并获得状态值。