2017-05-09 36 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