如何为启用HA的群集配置SparkContext

时间:2017-05-09 04:47:32

标签: java hadoop apache-spark

当我尝试使用HDFS文件系统在YARN模式下运行spark应用程序时,当我提供以下属性时,它可以正常工作。

sparkConf.set("spark.hadoop.yarn.resourcemanager.hostname",resourcemanagerHostname);
sparkConf.set("spark.hadoop.yarn.resourcemanager.address",resourcemanagerAddress);
sparkConf.set("spark.yarn.stagingDir",stagingDirectory );

但问题是:

  1. 由于我的HDFS启用了NamdeNode HA,因此当我提供spark.yarn.stagingDir hdfs的公共URL时,它将无法工作
  2. E.g。 hdfs://hdcluster/user/tmp/发出错误消息:

      

    有未知的主机hdcluster

    但是当我将网址设为hdfs://<ActiveNameNode>/user/tmp/时,它可以正常工作,但我们事先并不知道哪些网址会有效,所以如何解决?

    我注意到的一些事情是SparkContext采用Hadoop配置,但SparkConfiguration类没有任何接受Hadoop配置的方法。

    1. 当资源管理器在HA中运行时,如何提供资源管理器地址?

3 个答案:

答案 0 :(得分:1)

您需要使用hadoop配置文件中已存在的配置参数,例如yarn-site.xmlhdfs-site.xml

使用以下命令初始化Configuration对象:

val conf = new org.apache.hadoop.conf.Configuration()

要检查当前的HDFS URI,请使用:

val currentFS = conf.get("fs.defaultFS");

您将获得一个带有namenode URI的输出,例如:

res0: String = hdfs://namenode1

要检查当前使用的资源管理器的地址,请尝试:

val currentRMaddr = conf.get("yarn.resourcemanager.address")

答案 1 :(得分:0)

我遇到了完全相同的问题。这是解决方案(最后):

您必须为HDFS HA配置内部Spark Context Hadoop配置。在实例化Spark Context或Spark Session时,它将找到所有具有以spark.hadoop.开头的密钥的配置,并在实例化Hadoop配置时使用它们。

因此,为了能够使用hdfs://namespace/path/to/file而不能获得无效主机异常,请添加以下配置选项

spark.hadoop.fs.defaultFS = "hdfs://my-namespace-name"
spark.hadoop.ha.zookeeper.quorum = "real.hdfs.host.1.com:2181,real.hdfs.host.2.com:2181"
spark.hadoop.dfs.nameservices = "my-namespace-name"
spark.hadoop.dfs.client.failover.proxy.provider.my-namespace-name = org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
spark.hadoop.dfs.ha.automatic-failover.enabled.my-namespace-name = true
spark.hadoop.dfs.ha.namenodes.my-namespace-name = "realhost1,realhost2"
spark.hadoop.dfs.namenode.rpc-address.my-namespace-name.realhost1 = "real.hdfs.host.1.com:8020"
spark.hadoop.dfs.namenode.servicerpc-address.my-namespace-name.realhost1 = "real.hdfs.host.1.com:8022"
spark.hadoop.dfs.namenode.http-address.my-namespace-name.realhost1 = "real.hdfs.host.1.com:50070"
spark.hadoop.dfs.namenode.https-address.my-namespace-name.realhost1 = "real.hdfs.host.1.com:50470"
spark.hadoop.dfs.namenode.rpc-address.my-namespace-name.realhost2 = "real.hdfs.host.2.com:8020"
spark.hadoop.dfs.namenode.servicerpc-address.my-namespace-name.realhost2 = "real.hdfs.host.2.com:8022"
spark.hadoop.dfs.namenode.http-address.my-namespace-name.realhost2 = "real.hdfs.host.2.com:50070"
spark.hadoop.dfs.namenode.https-address.my-namespace-name.realhost2 = "real.hdfs.host.2.com:50470"
spark.hadoop.dfs.replication = 3
spark.hadoop.dfs.blocksize = 134217728
spark.hadoop.dfs.client.use.datanode.hostname = false
spark.hadoop.dfs.datanode.hdfs-blocks-metadata.enabled = true

答案 2 :(得分:0)

您可能正在查看var cells = dataGridView1.Rows[rowCount].Cells.Cast<DataGridViewCell>();中的HADOOP_CONF_DIR=/path/to/hdfs-site.xml/and/core-site.xml财产。提到的envioronment变量应该指向spark-env.shhdfs-site.xml存在的位置(与启动hadoop HA集群时使用的位置相同)。您应该可以使用core-site.xml而不会出现问题