如何通过包含外部hadoop集群的Spark中的H / A名称节点的URI访问hdfs?

时间:2015-06-12 06:52:05

标签: hadoop apache-spark hdfs

现在我有一些Spark应用程序将输出存储到HDFS。

由于我们的hadoop集群由namenode H / A组成,而spark集群在hadoop集群之外(我知道它不好)我需要为应用程序指定HDFS URI,以便它可以访问HDFS。

但它不能识别名称服务,因此我只能给出namenode的URI之一,如果失败,请修改配置文件并重试。

访问Zookeeper以显示活动似乎非常烦人,所以我想避免。

你能提出任何其他选择吗?

4 个答案:

答案 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-submitspark-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)

  1. 将hadoop配置目录复制到您的spark群集
  2. 通过在spark-env.sh中设置HADOOP_CONF_DIR来指向此目录的火花
  3. 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并获得状态值。