2016-11-09 7 views
1

私は構成ファイルからデータを読み取るSparkジョブを持っています。このファイルはタイプセーフな設定ファイルです。糸球でタイプセーフな設定を使用

設定を読み取るコードは以下のようになります。今

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

私は外部ファイルとしてファイルを渡したいので、私は私のユーバージャーの一部としてapplication.confを組み立てていない

私が使用する外部application.confの内容は、次のようになります。

com.mycompany { 
    //configurations my program needs 
} 

このapplication.confファイルには、私のローカルマシンのファイルシステム上に存在する(とないHDFS上)

私はこれは、コマンドがどのように見えるか、私の火花提出している糸

でスパーク1.6.1を使用しています:

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) 

そして、私の質問は、誰かが私のローカルマシンにspark-submitと糸を使っている外部のtypesafe 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は必要ありません。問題は、Sparkが渡された最後の--files引数とlog4jが渡された理由だけを使用していたことです。 log4j.xmlを使用するには、次のステップも踏まなければなりませんでした。
  • 次のようにspark submitに別の行を追加してください:--conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:log4j.xml" - 一度--filesを渡すと、ファイル名を参照せずパス

注:私はそれを試していないが、私が見たものから、あなたがクライアントモードでそれを実行しようとしている場合、私はspark.driver.extraJavaOptionsラインがドライバ-java-optionsの ザッツそれを何かに改名されるべきだと思います。とてもシンプルで、これらのことがよりよく文書化されたことを願っています。私はこの答えはあなたがむしろ旗をmulitple回を指定するよりも--files` `のためのファイルのカンマ区切りリストを使用することができるはず誰か

乾杯

+0

を助けることを願っています。 – vpipkt

+0

うん、ちょうど私がやったことはまったく同じだった – Gideon

+0

'--driver-java-options = ' - Dmy.config.path = myConfigValue'' [別の答え](https://stackoverflow.com/a/28214447/519951) ) – ruhong

関連する問題