2016-11-09 13 views
1

У меня есть работа Spark, которая считывает данные из файла конфигурации. Этот файл является типичным конфигурационным файлом.Использование configate config с Spark on Yarn

код, который читает конфиг выглядит следующим образом:

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) 

И поэтому мой вопрос: кто-нибудь знает, как я могу загрузить внешний файл typafe application.conf, который сидит на моей локальной машине с помощью spark-submit и пряжи?

Я попытался следующие некоторые из решений в 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. Нет необходимости в дополнительных JavaOpts для application.conf (как было написано в моем вопросе). Проблема в том, что Spark использовал только последний аргумент --files, который был передан, и именно поэтому передается log4j. Чтобы использовать log4j.xml, мне также пришлось сделать следующий шаг:
  • Добавить еще одну строку в искра: --conf spark.driver.extraJavaOptions="-Dlog4j.configuration=file:log4j.xml" - обратите внимание, что как только вы передадите ее с помощью -files, вы можете просто ссылаться на имя файла без каких-либо путь

Примечание: Я не пробовал, но от того, что я видел, если вы пытаетесь запустить его в режиме клиента, я думаю, что spark.driver.extraJavaOptions линия должна быть переименована в нечто вроде водителя-Java-варианты то оно , Так просто и я хочу, чтобы эти вещи были задокументированы лучше.Я надеюсь, что этот ответ поможет кому-то

Приветствия

+0

Вы должны быть в состоянии использовать запятую списка файлов для '--files', а не с указанием пометки Mulitple раза. – vpipkt

+0

Yup, именно это я и сделал – Gideon

+0

'--driver-java-options = '- Dmy.config.path = myConfigValue'' из [другого ответа] (https://stackoverflow.com/a/28214447/519951) – ruhong