2017-05-09 33 views
1

当我试图运行使用HDFS文件系统正常工作时,我提供以下特性纱模式火花应用。如何配置SparkContext为启用HA群集

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,它不会工作

例如hdfs://hdcluster/user/tmp/给人一个错误,指出:

有未知的主机hdcluster

但是,当我把它的URL为hdfs://<ActiveNameNode>/user/tmp/它工作正常,但我们不提前,这将是积极的怎么这么知道我解决这个问题?

而且几件事情我已经注意到有SparkContext需要Hadoop的配置,但SparkConfiguration类不会有任何的方法来接受Hadoop配置。

  • 如何在资源管理器在运行HA我提供的资源管理器的地址?
  • +0

    请妥善编辑你的问题。把代码放在'像这样'的部分。没有必要写感谢和姓名到底。 – surajsn

    回答

    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"); 
    

    您将得到一个输出您的名称节点的URI,是这样的:

    res0: String = hdfs://namenode1 
    

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

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

    我有完全相同的问题。这里是解决方案(最终):

    您必须配置内部星火上下文Hadoop配置为HDFS HA。当实例星火上下文或Spark会话时,会发现其中有开始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