Как передать параметр -D или переменную среды в задание Spark?


83

Я хочу изменить конфигурацию Typafe для задания Spark в среде dev / prod. Мне кажется, что самый простой способ добиться этого - перейти -Dconfig.resource=ENVNAMEна работу. Тогда библиотека конфигурации Typesafe сделает всю работу за меня.

Есть ли способ передать эту возможность напрямую работе? Или, может быть, есть лучший способ изменить конфигурацию задания во время выполнения?

РЕДАКТИРОВАТЬ:

  • Когда я добавляю --conf "spark.executor.extraJavaOptions=-Dconfig.resource=dev"опцию в команду spark-submit, ничего не происходит .
  • Я получил, Error: Unrecognized option '-Dconfig.resource=dev'.когда перешел -Dconfig.resource=devк команде spark-submit .

1
Укажите, пожалуйста, как вы начинаете свою работу. В общем, вы можете просто придерживаться -Dx=yкомандной строки.
Даниэль Дарабос,

@DanielDarabos Я начинаю свою работу с Spark-submit в YARN.
kopiczko

@kopiczko Можете ли вы принять ответ?
Дон Брэнсон

@DonBranson Я перепробовал все ответы здесь, и ни один из них не работал на Spark 1.6.0! У меня именно эта проблема. Кажется, я не могу переопределить свойство конфигурации в моем файле конфигурации Typesafe с помощью параметра -D.
nemo

@kopiczko Удалось найти решение?
nemo

Ответы:


58

Измените spark-submitкомандную строку, добавив три параметра:

  • --files <location_to_your_app.conf>
  • --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'
  • --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'

19
Обратите внимание, что использование этой --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'опции не будет работать, если Spark отправит драйвер в клиентском режиме. --driver-java-options "-Dconfig.resource=app"Вместо этого используйте . См. Конфигурация Spark .
YoYo

2
На Пряжа я использовал: в файлах дает имя по отношению к исполнителям; поэтому они будут видеть указанный файл как application.conf. --files <location_to_your.conf>#application.conf --driver-java-options -Dconfig.file=your.conf#
vpipkt

В качестве альтернативыspark-submit --driver-java-options='-Dmy.config.path=myConfigValue'
Жан-Адриан

@kopiczko Это не работает для меня ... это решило вашу проблему?
nemo

У меня это работало еще в 2015 году. Банкомат Я даже не могу сказать, какая это была версия Spark.
kopiczko

21

Вот моя искровая программа, запущенная с дополнительным параметром java

/home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \
--files /home/spark/jobs/fact_stats_ad.conf \
--conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf \
--conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH -Dalluxio.user.file.write.location.policy.class=alluxio.client.file.policy.MostAvailableFirstPolicy -Dconfig.file=/home/spark/jobs/fact_stats_ad.conf' \
--class jobs.DiskDailyJob \
--packages com.databricks:spark-csv_2.10:1.4.0 \
--jars /home/spark/jobs/alluxio-core-client-1.2.0-RC2-jar-with-dependencies.jar \
--driver-memory 2g \
/home/spark/jobs/convert_to_parquet.jar \
AD_COOKIE_REPORT FACT_AD_STATS_DAILY | tee /data/fact_ad_stats_daily.log

как вы можете видеть пользовательский файл конфигурации --files /home/spark/jobs/fact_stats_ad.conf

параметры java исполнителя --conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf

параметры драйвера java. --conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH -Dalluxio.user.file.write.location.policy.class=alluxio.client.file.policy.MostAvailableFirstPolicy -Dconfig.file=/home/spark/jobs/fact_stats_ad.conf'

Надеюсь, это поможет.


Этот ответ помогает показать формат передачи нескольких параметров в виде списка пар -Dkey = value, разделенных пробелами.
Пол

9

У меня было много проблем с передачей параметров -D для запуска исполнителей и драйвера, я добавил об этом цитату из своего сообщения в блоге: «Правильный способ передать параметр - через свойство:« spark.driver.extraJavaOptions»и« spark.executor.extraJavaOptions»: Я передал и свойство конфигурации log4J, и параметр, который мне нужен для конфигураций. (Драйверу я смог передать только конфигурацию log4j). Например (был записан в файле свойств, переданном в spark-submit с помощью «- файл свойств »):«

spark.driver.extraJavaOptions –Dlog4j.configuration=file:///spark/conf/log4j.properties -
spark.executor.extraJavaOptions –Dlog4j.configuration=file:///spark/conf/log4j.properties -Dapplication.properties.file=hdfs:///some/path/on/hdfs/app.properties
spark.application.properties.file hdfs:///some/path/on/hdfs/app.properties

«

Вы можете прочитать мое сообщение в блоге об общих конфигурациях Spark. Я тоже использую Yarn.


Пожалуйста, добавьте к нему больше контента и избегайте ответа только по ссылке.
Аджай Гупта

7

--files <location_to_your_app.conf> --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app' --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'

если вы напишете таким образом, то последнее --confперезапишет предыдущее, вы можете проверить это, посмотрев на sparkUI после запуска задания на Environmentвкладке.

поэтому правильный способ - поместить параметры в одну строку, например: --conf 'spark.executor.extraJavaOptions=-Da=b -Dc=d' если вы это сделаете, вы увидите, что все ваши настройки будут отображаться в SparkUI.


Я не верю, что это верно для флага «--conf», хотя это верно для «--files».
Penumbra

Я тестировал 2.1.0 и 2.1.1. согласно sparkUI-> Environment, я вижу только более поздний, если мы используем его --confдважды.
linehrr

1
Я считаю ваш пример ошибочным. Вы показываете два отдельных и совершенно разных ключа / значения после флага "--conf" (один исполнитель, один драйвер). Они не могут перезаписывать друг друга. Если вы говорите, что вступит в силу только последнее повторение любой опции --conf, вы правы, но ваш пример этого не показывает. В spark-submit: - У вас может быть одна опция --files, последняя из которых (если несколько) будет использоваться, а более ранняя игнорируется - У вас может быть несколько параметров --conf key = value, но если вы дублируете ключ он примет последнее значение
Penumbra

3

Я запускаю свое приложение Spark с помощью команды spark-submit, запущенной из другого приложения Scala. Итак, у меня есть массив вроде

Array(".../spark-submit", ..., "--conf", confValues, ...)

где confValuesнаходится:

  • для yarn-clusterрежима:
    "spark.driver.extraJavaOptions=-Drun.mode=production -Dapp.param=..."
  • для local[*]режима:
    "run.mode=development"

Однако немного сложно понять, где (не) избегать кавычек и пробелов. Вы можете проверить веб-интерфейс Spark на предмет значений системных свойств.


Это сработало для меня! (по крайней мере для local[*]режима). Попробую с yarn-clusterрежимом и
обновлю

3
spark-submit --driver-java-options "-Denv=DEV -Dmode=local" --class co.xxx.datapipeline.jobs.EventlogAggregator target/datapipeline-jobs-1.0-SNAPSHOT.jar

Приведенная выше команда работает для меня:

-Denv=DEV=> для чтения файла свойств DEV env и
-Dmode=local=> для создания SparkContext в локальном - .setMaster ("local [*]")


0

Используйте метод, как в команде ниже, может быть вам полезен -

spark-submit --master local [2] --conf 'spark.driver.extraJavaOptions = Dlog4j.configuration = file: /tmp/log4j.properties' --conf 'spark.executor.extraJavaOptions = -Dlog4j.configuration = файл: /tmp/log4j.properties ' --class com.test.spark.application.TestSparkJob target / application-0.0.1-SNAPSHOT-jar-with-dependencies.jar prod

Я пробовал, и это сработало для меня, я бы посоветовал также пройтись по заголовку ниже, что действительно полезно - https://spark.apache.org/docs/latest/running-on-yarn.html


0

Изначально у меня был этот файл конфигурации:

my-app {
  environment: dev
  other: xxx
}

Вот как я загружаю свою конфигурацию в свой код Spark Scala:

val config = ConfigFactory.parseFile(File<"my-app.conf">)
  .withFallback(ConfigFactory.load())
  .resolve
  .getConfig("my-app")

С этой настройкой, несмотря на то, что говорится в документации по Typesafe Config и во всех других ответах, переопределение системного свойства не сработало для меня, когда я запустил свою искровую работу следующим образом:

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --name my-app \
  --driver-java-options='-XX:MaxPermSize=256M -Dmy-app.environment=prod' \
  --files my-app.conf \
  my-app.jar

Чтобы заставить его работать, мне пришлось изменить свой файл конфигурации на:

my-app {
  environment: dev
  environment: ${?env.override}
  other: xxx
}

а затем запускаем так:

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --name my-app \
  --driver-java-options='-XX:MaxPermSize=256M -Denv.override=prod' \
  --files my-app.conf \
  my-app.jar

Я использую
nemo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.