2016-11-09 2 views
1

Ich habe einen Spark-Job, der Daten aus einer Konfigurationsdatei liest. Diese Datei ist eine typsichere Konfigurationsdatei.Verwenden von typesafe config mit Spark on Yarn

Der Code, der die config liest sieht wie folgt aus:

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

Jetzt

ich die application.conf als Teil meiner uber jar nicht zusammenbauen, da ich die Datei als externe Datei übergeben möchten

der Inhalt der externen application.conf ich wie folgt aussieht verwenden möchten:

com.mycompany { 
    //configurations my program needs 
} 

diese application.conf Datei auf meinem lokalen Rechner Dateisystem vorhanden ist (und nicht auf HDFS)

Ich bin mit Spark-1.6.1 mit Garn

Dies ist, wie mein Funken einreichen Befehl wie folgt aussieht:

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 

Die Ausnahme, die ich erhalten ist:

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) 

Und also meine frage ist: weiß jemand wie ich eine externe typsichere application.conf-datei laden kann, die auf meinem lokalen Rechner mit funke-submit und garn sitzt?

Ich habe versucht, einige der Lösungen in How to add a typesafe config file which is located on HDFS to spark-submit (cluster-mode)? und in Typesafe Config in Spark folgenden und auch in How to pass -D parameter or environment variable to Spark job? und nichts funktionierte

ich jede Richtung zu schätzen weiß diesen

Vielen Dank im Voraus

Antwort

3

Also mit einem zur Lösung wenig graben im Spark 1.6.1 Quellcode fand ich die Lösung.

Dies sind die Schritte, die Sie ergreifen müssen, um sowohl die log4j und die application.conf zu bekommen von Ihrer Anwendung verwendet werden, wenn Modus Cluster Garn einreichen:

  • Wenn mehrere Dateien wie ich vorbei war dabei, sowohl die application.conf als auch die log4j.xml-Datei zu übergeben, die Sie mit nur einer Zeile wie folgt senden müssen: --files "$ROOT_DIR/application.conf,$LOG4J_FULL_PATH/log4j.xml" (trennen Sie sie durch Komma)
  • Das ist es für die application.conf. Es gibt keine Notwendigkeit für die extraJavaOpts für die application.conf (wie in meiner Frage geschrieben). Das Problem ist, dass Spark nur das letzte --files-Argument verwendet hat, das übergeben wurde, und deshalb wurde log4j übergeben. Um log4j.xml zu verwenden, musste ich auch den folgenden Schritt ausführen:
  • Fügen Sie eine weitere Zeile zum Spark-Submit wie folgt hinzu: --conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:log4j.xml" - beachten Sie, dass Sie, wenn Sie es mit --files übergeben, einfach auf den Dateinamen verweisen können Weg

Anmerkung: ich habe nicht versucht, aber von dem, was ich sah, wenn Sie versuchen, es im Client-Modus laufen zu lassen ich denke, die spark.driver.extraJavaOptions Linie das ist so etwas wie Treiber-java-Optionen umbenannt werden soll . So einfach und ich wünschte, diese Dinge wären besser dokumentiert.Ich hoffe, dass diese Antwort jemand

Prost

+0

helfen Sie sollten verwenden, um das Flag mulitple mal eine durch Kommata getrennte Liste von Dateien für '--files' statt angeben. – vpipkt

+0

Yup, das ist genau das, was ich am Ende tun – Gideon

+0

'--driver-java-Optionen = '- Dmy.config.path = myConfigValue'' von [einem anderen Antwort] (https://stackoverflow.com/a/28214447/519951) – ruhong

Verwandte Themen