如何通过外hadoop集群Spark中H/A个namenode组成的URI访问hdfs?
How to access hdfs by URI consisting of H/A namenodes in Spark which is outer hadoop cluster?
现在我有一些将输出存储到 HDFS 的 Spark 应用程序。
由于我们的 hadoop 集群由 namenode H/A 组成,而 spark 集群在 hadoop 集群之外(我知道这是不好的)我需要为应用程序指定 HDFS URI,以便它可以访问 HDFS。
但是不识别name service所以我只能给一个namenode的URI,如果不行,修改配置文件再试
访问 Zookeeper 以显示活动似乎很烦人,所以我想避免。
你能推荐任何替代方案吗?
假设您的名称服务是 '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")
在此之后,您可以将 URL 与 'hadooptest' 一起使用,如下所示。
test.write.orc("hdfs://hadooptest/tmp/test/r1")
查看here了解更多信息。
- 将 hadoop 配置目录复制到您的 spark 集群
- 通过在 spark-env.sh
中设置 HADOOP_CONF_DIR 将 spark 指向此目录
例如
echo "HADOOP_CONF_DIR=\"/opt/hadoop/etc/hadoop\"" > spark-env.sh
我遇到过类似类型的问题。在我的例子中,我有启用 HA 的环境的主机列表,但在 "Active" 节点之上没有信息。
为了解决这个问题,我使用了 webhdfs 调用来获取每个节点的状态,这是我在代码中使用的 webhdfs 调用 -
curl 'http://[hdfsHost]:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus'
我用不同的 HDFS 主机进行了上述调用。它 return "state" 每个节点的 json 输出,像这样
{
"..." : [ {
"name" : "Hadoop:service=NameNode,name=NameNodeStatus",
"modelerType" : "org.apache.hadoop.hdfs.server.namenode.NameNode",
"State" : "active",
.......
} ]
}
如果节点待命你会得到 "State" : "standby"
获得 JSON 后,您可以解析 json 并获得 state 值。
如果你想将 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')
对于启用了 kerberos 的集群,您可以使用以下属性访问 HDFS。更多信息 here。您可以从删除 HA hdfs-site.xml
文件中获取这些信息。
spark.sparkContext.hadoopConfiguration.set("dfs.nameservices", "testnameservice")
spark.sparkContext.hadoopConfiguration.set("dfs.client.failover.proxy.provider.testnameservice", "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider")
spark.sparkContext.hadoopConfiguration.set("dfs.ha.namenodes.testnameservice", "nn1,nn2")
spark.sparkContext.hadoopConfiguration.set("dfs.namenode.rpc-address.testnameservice.nn1", "namenode1_hostname:8020")
spark.sparkContext.hadoopConfiguration.set("dfs.namenode.rpc-address.testnameservice.nn2", "namenode2_hostname:8020")
spark.read.csv("hdfs://testnameservice/path/to/hdfs/sample.csv")
如果您还设置了 spark 以在使用此 属性 spark.kerberos.access.hadoopFileSystems
启动时访问 kerberos 令牌 spark > 3.0 or spark.kerberos.access.namenodes
for Spark < 3.0 as mentioned here。不幸的是,为此,它只需要活动名称节点配置,您必须在 http://namenode_service:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus
轮询名称节点服务或名称节点并检索活动名称节点。
现在我有一些将输出存储到 HDFS 的 Spark 应用程序。
由于我们的 hadoop 集群由 namenode H/A 组成,而 spark 集群在 hadoop 集群之外(我知道这是不好的)我需要为应用程序指定 HDFS URI,以便它可以访问 HDFS。
但是不识别name service所以我只能给一个namenode的URI,如果不行,修改配置文件再试
访问 Zookeeper 以显示活动似乎很烦人,所以我想避免。
你能推荐任何替代方案吗?
假设您的名称服务是 '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")
在此之后,您可以将 URL 与 'hadooptest' 一起使用,如下所示。
test.write.orc("hdfs://hadooptest/tmp/test/r1")
查看here了解更多信息。
- 将 hadoop 配置目录复制到您的 spark 集群
- 通过在 spark-env.sh 中设置 HADOOP_CONF_DIR 将 spark 指向此目录
例如
echo "HADOOP_CONF_DIR=\"/opt/hadoop/etc/hadoop\"" > spark-env.sh
我遇到过类似类型的问题。在我的例子中,我有启用 HA 的环境的主机列表,但在 "Active" 节点之上没有信息。
为了解决这个问题,我使用了 webhdfs 调用来获取每个节点的状态,这是我在代码中使用的 webhdfs 调用 -
curl 'http://[hdfsHost]:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus'
我用不同的 HDFS 主机进行了上述调用。它 return "state" 每个节点的 json 输出,像这样
{
"..." : [ {
"name" : "Hadoop:service=NameNode,name=NameNodeStatus",
"modelerType" : "org.apache.hadoop.hdfs.server.namenode.NameNode",
"State" : "active",
.......
} ]
}
如果节点待命你会得到 "State" : "standby"
获得 JSON 后,您可以解析 json 并获得 state 值。
如果你想将 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')
对于启用了 kerberos 的集群,您可以使用以下属性访问 HDFS。更多信息 here。您可以从删除 HA hdfs-site.xml
文件中获取这些信息。
spark.sparkContext.hadoopConfiguration.set("dfs.nameservices", "testnameservice")
spark.sparkContext.hadoopConfiguration.set("dfs.client.failover.proxy.provider.testnameservice", "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider")
spark.sparkContext.hadoopConfiguration.set("dfs.ha.namenodes.testnameservice", "nn1,nn2")
spark.sparkContext.hadoopConfiguration.set("dfs.namenode.rpc-address.testnameservice.nn1", "namenode1_hostname:8020")
spark.sparkContext.hadoopConfiguration.set("dfs.namenode.rpc-address.testnameservice.nn2", "namenode2_hostname:8020")
spark.read.csv("hdfs://testnameservice/path/to/hdfs/sample.csv")
如果您还设置了 spark 以在使用此 属性 spark.kerberos.access.hadoopFileSystems
启动时访问 kerberos 令牌 spark > 3.0 or spark.kerberos.access.namenodes
for Spark < 3.0 as mentioned here。不幸的是,为此,它只需要活动名称节点配置,您必须在 http://namenode_service:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus
轮询名称节点服务或名称节点并检索活动名称节点。