当我尝试使用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 );
但问题是:
E.g。 hdfs://hdcluster/user/tmp/
发出错误消息:
有未知的主机hdcluster
但是当我将网址设为hdfs://<ActiveNameNode>/user/tmp/
时,它可以正常工作,但我们事先并不知道哪些网址会有效,所以如何解决?
我注意到的一些事情是SparkContext采用Hadoop配置,但SparkConfiguration类没有任何接受Hadoop配置的方法。
答案 0 :(得分:1)
您需要使用hadoop配置文件中已存在的配置参数,例如yarn-site.xml
,hdfs-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.sh
和hdfs-site.xml
存在的位置(与启动hadoop HA集群时使用的位置相同)。您应该可以使用core-site.xml
而不会出现问题