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

如何通过外部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配置。

现在我有了一些Spark应用程序,它们将输出存储到HDFS

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

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

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


您能推荐一些替代方案吗?

假设您的名称服务是“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")
查看更多信息

  • 将hadoop配置目录复制到spark集群
  • 通过在spark-env.sh中设置HADOOP_CONF_dir,将spark指向该目录
  • e、 g


    我遇到了类似的问题。在我的例子中,我拥有启用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')