2016-11-09 118 views
1

星火使用類型安全的配置我有一個Spark工作,從一個配置文件中讀取數據。這個文件是一個類型安全的配置文件。與紗線

,讀取配置的代碼看起來像這樣:

ConfigFactory.load().getConfig("com.mycompany") 

現在,因爲我想將文件傳遞作爲外部文件我不組裝application.conf作爲我的超級罐子的一部分

外部application.conf我想使用的內容是這樣的:

com.mycompany { 
    //configurations my program needs 
} 

這application.conf文件存在我的本地機器的文件系統上(而不是HDFS)

我使用的是1.6.1的Spark使用紗線

這是怎麼我的火花提交命令看起來像:

LOG4J_FULL_PATH=/log4j-path 
ROOT_DIR=/application.conf-path 

    /opt/deploy/spark/bin/spark-submit \ 
    --class com.mycompany.Main \ 
    --master yarn \ 
    --deploy-mode cluster \ 
    --files $ROOT_DIR/application.conf \ 
    --files $LOG4J_FULL_PATH/log4j.xml \ 
    --conf spark.executor.extraClassPath="-Dconfig.file=file:application.conf" \ 
    --driver-class-path $ROOT_DIR/application.conf \ 
    --verbose \ 
    /opt/deploy/lal-ml.jar 

我收到的例外是:

2016-11-09 12:32:14 ERROR ApplicationMaster:95 - User class threw exception: com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'com' 
com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'com' 
    at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:124) 
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:147) 
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:159) 
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:164) 
    at com.typesafe.config.impl.SimpleConfig.getObject(SimpleConfig.java:218) 
    at com.typesafe.config.impl.SimpleConfig.getConfig(SimpleConfig.java:224) 
    at com.typesafe.config.impl.SimpleConfig.getConfig(SimpleConfig.java:33) 
    at com.mycompany.Main$.main(Main.scala:36) 
    at com.mycompany.Main.main(Main.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:542) 

而且所以我的問題是:沒有任何人知道我可以加載坐在我的本地機器上的火花提交和紗線外部類型安全application.conf文件?

我嘗試下面的一些解決方案的How to add a typesafe config file which is located on HDFS to spark-submit (cluster-mode)?Typesafe Config in Spark,並在How to pass -D parameter or environment variable to Spark job?並沒有什麼工作

我會很感激任何方向提前一個解決這個

感謝

回答

3

所以在Spark 1.6.1源代碼中很少挖掘我找到了解決方案。

這些是您提交使用羣集模式到紗線時,需要採取以同時獲得log4j的和application.conf正在使用你的應用程序的步驟:

  • 當路過幾個文件,如我在做傳球都需要使用只是這樣一行來提交他們application.conf和的log4j.xml文件:--files "$ROOT_DIR/application.conf,$LOG4J_FULL_PATH/log4j.xml"(用逗號將它們分開)
  • 這就是它的application.conf。 application.conf中沒有必要使用extraJavaOpts(正如我的問題中所寫)。問題是,星火只使用已傳遞而這就是爲什麼log4j的是正在傳遞的最後--files說法。爲了使用的log4j.xml我也不得不採取以下步驟
  • 另一行添加到火花提交這樣的:--conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:log4j.xml" - 請注意,一旦你與--files通過它你可以參考的文件名沒有任何路徑

注:我還沒有嘗試過,但是從我所看到的,如果你想在客戶端模式下運行它,我覺得spark.driver.extraJavaOptions線應該改名爲類似於驅動程序的Java選項 完蛋了。這麼簡單,我希望這些事情被記錄得更好。我希望這個答案會幫助別人

乾杯

+0

你應該能夠用逗號分隔的文件列表'而--files'不是指定的標誌多張倍。 – vpipkt

+0

是的,這就是我最終做的 – Gideon

+0

'--driver-java-options =' - Dmy.config.path = myConfigValue'' from [another answer](https://stackoverflow.com/a/28214447/519951 ) – ruhong