Jak przekazać parametr -D lub zmienną środowiskową do zadania Spark?

83

Chcę zmienić konfigurację Typesafe zadania Spark w środowisku dev / prod. Wydaje mi się, że najłatwiejszym sposobem na osiągnięcie tego jest przejście -Dconfig.resource=ENVNAMEdo pracy. Wtedy biblioteka konfiguracyjna Typesafe zrobi to za mnie.

Czy istnieje sposób, aby przekazać tę opcję bezpośrednio do zadania? A może jest lepszy sposób na zmianę konfiguracji zadania w czasie wykonywania?

EDYTOWAĆ:

  • Nic się nie dzieje, gdy dodam --conf "spark.executor.extraJavaOptions=-Dconfig.resource=dev"opcję polecenia wysyłania iskry .
  • Dostałem, Error: Unrecognized option '-Dconfig.resource=dev'.kiedy przechodzę -Dconfig.resource=devdo polecenia wysyłania iskry .
kopiczko
źródło
1
Określ, w jaki sposób zaczynasz swoją pracę. Ogólnie możesz po prostu trzymać -Dx=ysię wiersza poleceń.
Daniel Darabos
@DanielDarabos Rozpoczynam pracę od spark-submit w YARN.
kopiczko
@kopiczko Czy możesz przyjąć odpowiedź?
Don Branson
@DonBranson Wypróbowałem wszystkie odpowiedzi tutaj i żadna nie zadziałała w przypadku Spark 1.6.0! Mam dokładnie ten problem. Wydaje się, że nie mogę zastąpić właściwości config w moim pliku konfiguracyjnym Typesafe za pomocą parametru -D.
nemo
@kopiczko Czy udało Ci się znaleźć rozwiązanie?
nemo

Odpowiedzi:

58

Zmień spark-submitwiersz poleceń, dodając trzy opcje:

  • --files <location_to_your_app.conf>
  • --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'
  • --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'
kopiczko
źródło
19
Zauważ, że użycie tej --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'opcji nie zadziała, gdy Spark prześle sterownik w trybie klienta. Użyj --driver-java-options "-Dconfig.resource=app"zamiast tego. Zobacz Konfiguracja Spark .
YoYo
2
Na przędzy użyłem: --files <location_to_your.conf>#application.conf --driver-java-options -Dconfig.file=your.conf W #plikach in podaje nazwę odnoszącą się do executorów; więc zobaczą określony plik jako application.conf.
vpipkt
Alternatywniespark-submit --driver-java-options='-Dmy.config.path=myConfigValue'
Jean-Adrien,
@kopiczko To nie działa dla mnie ... czy to rozwiązało twój problem?
nemo
Pracował dla mnie w 2015 roku. ATM Nie mogę nawet powiedzieć, jaka to była wersja Spark.
kopiczko
21

Oto mój program Spark uruchomiony z dodatkową opcją 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

jak widać niestandardowy plik konfiguracyjny --files /home/spark/jobs/fact_stats_ad.conf

opcje java executora --conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf

opcje sterownika 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'

Mam nadzieję, że to pomoże.

giaosudau
źródło
Ta odpowiedź pomaga w pokazaniu formatu przekazywania wielu opcji jako listy par -Dkey = wartość oddzielonych spacjami.
Paul
9

Miałem wiele problemów z przekazaniem parametrów -D do executorów iskra i sterownika, dodałem cytat z mojego wpisu na blogu na ten temat: „Właściwym sposobem przekazania parametru jest właściwość:„ spark.driver.extraJavaOptions”i„ spark.executor.extraJavaOptions”: Przekazałem zarówno właściwość konfiguracji log4J, jak i parametr, którego potrzebowałem do konfiguracji. (Do sterownika mogłem przekazać tylko konfigurację log4j). Na przykład (zostało zapisane w pliku właściwości przekazanym w funkcji przesyłania iskier z „- plik-właściwości ”):„

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

Możesz przeczytać mój wpis na blogu o ogólnych konfiguracjach Spark. Biegam również na Yarn.

Demi Ben-Ari
źródło
Dodaj do niego więcej treści i unikaj odpowiedzi tylko na link.
Ajay Gupta
7

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

jeśli napiszesz w ten sposób to późniejszy --confnadpisze poprzedni, możesz to zweryfikować zaglądając do sparkUI po uruchomieniu zadania w Environmentzakładce.

więc poprawnym sposobem jest umieszczenie opcji w tej samej linii, jak ta: --conf 'spark.executor.extraJavaOptions=-Da=b -Dc=d' jeśli to zrobisz, możesz znaleźć wszystkie swoje ustawienia, które zostaną pokazane w sparkUI.

linehrr
źródło
Nie wierzę, że jest to prawdą dla flagi „--conf”, chociaż jest to prawdą dla „--files”.
Penumbra
Testowałem na 2.1.0 i 2.1.1. zgodnie z sparkUI-> Environment, widzę tylko późniejszy, jeśli używamy --confdwa razy.
linehrr
1
Myślę, że twój przykład jest błędny. Po fladze "--conf" pokazane są dwie oddzielne i całkowicie różne pary klucz / wartości (jeden moduł wykonawczy, jeden sterownik). Nie mogą się one nadpisywać. Jeśli mówisz, że tylko ostatnie powtórzenie którejkolwiek opcji --conf odniesie skutek, masz rację, ale twój przykład tego nie pokazuje. W Spark-submit: - Możesz mieć opcję One --files, z której ostatnia (jeśli jest wiele) zostanie użyta, a wcześniejsza zostanie zignorowana - Możesz mieć wiele opcji --conf key = value, ale jeśli zduplikujesz klucz przyjmie ostatnią wartość
Penumbra
3

Uruchamiam moją aplikację Spark za pomocą polecenia spark-submit uruchomionego z innej aplikacji Scala. Więc mam Array jak

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

gdzie confValuesjest:

  • dla yarn-clustertrybu:
    "spark.driver.extraJavaOptions=-Drun.mode=production -Dapp.param=..."
  • dla local[*]trybu:
    "run.mode=development"

Trochę trudno jest jednak zrozumieć, gdzie (nie) należy unikać cudzysłowów i spacji. Możesz sprawdzić interfejs internetowy Spark pod kątem wartości właściwości systemowych.

tgpfeiffer
źródło
To zadziałało dla mnie! (przynajmniej dla local[*]trybu). Spróbuję z yarn-clustertrybem i zaktualizuję komentarz (jeśli nie zapomnę ...: D)
acidghost
3
spark-submit --driver-java-options "-Denv=DEV -Dmode=local" --class co.xxx.datapipeline.jobs.EventlogAggregator target/datapipeline-jobs-1.0-SNAPSHOT.jar

U mnie działa powyższe polecenie:

-Denv=DEV=> czytać plik właściwości DEV env i
-Dmode=local=> tworzyć SparkContext w lokalnym - .setMaster ("local [*]")

Yoga Gowda
źródło
0

Użyj metody jak w poniższym poleceniu, może być dla Ciebie pomocne -

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

Próbowałem i zadziałało dla mnie, proponuję również przejść przez nagłówek poniżej Spark Post, który jest naprawdę pomocny - https://spark.apache.org/docs/latest/running-on-yarn.html

Nitesh Saxena
źródło
0

Pierwotnie miałem ten plik konfiguracyjny:

my-app {
  environment: dev
  other: xxx
}

Oto jak ładuję konfigurację w moim kodzie Spark Scala:

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

W tej konfiguracji, pomimo tego, co mówi dokumentacja Typesafe Config i wszystkie inne odpowiedzi, nadpisanie właściwości systemu nie działało, gdy uruchomiłem moją iskierkę w następujący sposób:

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

Aby to działało, musiałem zmienić plik konfiguracyjny na:

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

a następnie uruchom go w ten sposób:

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
źródło
Uruchamiam Spark 1.6.0 BTW
nemo