Як передати параметр -D або змінну середовища в роботу Spark?


83

Я хочу змінити конфігурацію Typesafe завдання 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 Я починаю свою роботу з іскрового подання на пряжу.
kopiczko

@kopiczko Чи можете ви прийняти відповідь?
Дон Бренсон

@DonBranson Я спробував усі відповіді тут, і жоден не працював у мене на іскрі 1.6.0! У мене саме це питання. Здається, я не можу замінити властивість config у моєму файлі конфігурації 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'опції не буде працювати, коли іскра передає драйвер у клієнтському режимі. Використовуйте --driver-java-options "-Dconfig.resource=app"замість цього. Див. Конфігурація іскри .
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 options --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 = значення.
Пол

9

У мене було багато проблем з передачею параметрів -D для виконавців і драйвера, я додав цитату з мого повідомлення в блозі про це: "Правильний спосіб передачі параметра - через властивість:" spark.driver.extraJavaOptions"та" spark.executor.extraJavaOptions": Я передав як властивість конфігурацій log4J, так і параметр, який мені потрібен для конфігурацій. (Драйверу я зміг передати лише конфігурацію log4j). Наприклад (записано у файлі властивостей, переданому в spark-submit з “- properties-file "):"

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

Ви можете прочитати мій допис у блозі про загальні конфігурації іскри. Я також бігаю по пряжі.


Будь ласка, додайте до нього ще трохи вмісту та уникайте відповіді лише на посилання.
Аджай Гупта,

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-> Навколишнє середовище, я бачу лише наступний, якщо ми використовуємо --confдвічі.
linehrr

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

3

Я запускаю свою програму Spark за допомогою команди spark-submit, запущеної з іншої програми Scala. Отже, у мене є Array like

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 = file: /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
}

Ось як я завантажую свою конфігурацію в свій іскровий масштабний код:

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

Я запускаю іскру 1.6.0 BTW
nemo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.