Wie übergebe ich -D Parameter oder Umgebungsvariable an Spark Job?

83

Ich möchte die typesichere Konfiguration eines Spark-Jobs in einer dev / prod-Umgebung ändern . Es scheint mir, dass der einfachste Weg, dies zu erreichen, darin besteht, -Dconfig.resource=ENVNAMEauf den Job überzugehen. Dann erledigt die Typesafe-Konfigurationsbibliothek die Arbeit für mich.

Gibt es eine Möglichkeit, diese Option direkt an den Job zu übergeben? Oder gibt es eine bessere Möglichkeit, die Jobkonfiguration zur Laufzeit zu ändern?

BEARBEITEN:

  • Es passiert nichts, wenn ich dem Befehl spark-submit eine --conf "spark.executor.extraJavaOptions=-Dconfig.resource=dev"Option hinzufüge .
  • Ich habe, Error: Unrecognized option '-Dconfig.resource=dev'.als ich -Dconfig.resource=devzum Spark-Submit- Befehl übergehe .
kopiczko
quelle
1
Bitte geben Sie an, wie Sie Ihren Job beginnen. Im Allgemeinen können Sie einfach -Dx=yin der Befehlszeile bleiben .
Daniel Darabos
@DanielDarabos Ich beginne meinen Job mit Spark-Submit auf YARN.
Kopiczko
@kopiczko Kannst du eine Antwort akzeptieren?
Don Branson
@ DonBranson Ich habe alle Antworten hier ausprobiert und keine hat bei Spark 1.6.0 von mir funktioniert! Ich habe genau dieses Problem. Ich kann eine Konfigurationseigenschaft in meiner Typesafe-Konfigurationskonfigurationsdatei nicht über einen -D-Parameter überschreiben.
Nemo
@kopiczko Haben Sie es geschafft, eine Lösung zu finden?
Nemo

Antworten:

58

Ändern Sie die spark-submitBefehlszeile und fügen Sie drei Optionen hinzu:

  • --files <location_to_your_app.conf>
  • --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'
  • --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'
kopiczko
quelle
19
Beachten Sie, dass die Verwendung der --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'Option nicht funktioniert, wenn spark den Treiber im Client-Modus sendet. Verwenden Sie --driver-java-options "-Dconfig.resource=app"stattdessen. Siehe Spark-Konfiguration .
YoYo
2
Auf Garn habe ich verwendet: --files <location_to_your.conf>#application.conf --driver-java-options -Dconfig.file=your.conf Die #In-Dateien geben den Namen relativ zu den Ausführenden an; Daher wird die angegebene Datei als application.conf angezeigt.
vpipkt
Alternativspark-submit --driver-java-options='-Dmy.config.path=myConfigValue'
Jean-Adrien
@kopiczko Das funktioniert bei mir nicht ... hat das dein Problem gelöst?
Nemo
Es hat 2015 für mich funktioniert. Geldautomat Ich kann nicht einmal sagen, um welche Spark-Version es sich handelt.
Kopiczko
21

Hier ist mein Spark-Programm, das mit der zusätzlichen Java-Option ausgeführt wird

/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

wie Sie die benutzerdefinierte Konfigurationsdatei sehen können --files /home/spark/jobs/fact_stats_ad.conf

die Java-Optionen des Executors --conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf

die Treiber-Java-Optionen. --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'

Hoffe es kann helfen.

Giaosudau
quelle
Diese Antwort hilft dabei, das Format für die Übergabe mehrerer Optionen als durch Leerzeichen getrennte Liste von -Dkey = Wert-Paaren anzuzeigen.
Paul
9

Ich hatte viele Probleme mit der Übergabe von -D-Parametern an Spark-Executoren und den Treiber. Ich habe ein Zitat aus meinem Blog-Beitrag dazu hinzugefügt: "Der richtige Weg, den Parameter zu übergeben, ist über die Eigenschaft:" spark.driver.extraJavaOptions"und" spark.executor.extraJavaOptions": Ich habe sowohl die log4J-Konfigurationseigenschaft als auch den Parameter übergeben, den ich für die Konfigurationen benötigte. (An den Treiber konnte ich nur die log4j-Konfiguration übergeben.) Zum Beispiel (wurde in eine Eigenschaftendatei geschrieben, die in spark-submit mit „- Eigenschaftendatei ”):“

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

Sie können meinen Blog-Beitrag über allgemeine Konfigurationen von Funken lesen . Ich laufe auch auf Garn.

Demi Ben-Ari
quelle
Bitte fügen Sie weitere Inhalte hinzu und vermeiden Sie die Antwort nur mit Links.
Ajay Gupta
7

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

Wenn Sie auf diese Weise schreiben, --confwird der vorherige den vorherigen überschreiben. Sie können dies überprüfen, indem Sie sich sparkUI ansehen, nachdem der Job unter Environmenttab gestartet wurde .

Der richtige Weg ist also, die Optionen wie folgt unter dieselbe Zeile zu setzen: --conf 'spark.executor.extraJavaOptions=-Da=b -Dc=d' Wenn Sie dies tun, werden Sie feststellen, dass alle Ihre Einstellungen unter sparkUI angezeigt werden.

linehrr
quelle
Ich glaube nicht, dass dies für das Flag "--conf" gilt, obwohl dies für "--files" gilt.
Penumbra
Ich habe auf 2.1.0 und 2.1.1 getestet. Laut sparkUI-> Environment sehe ich die spätere nur, wenn wir sie --confzweimal verwenden.
Linehrr
1
Ich denke, Ihr Beispiel ist fehlerhaft. Nach dem Flag "--conf" werden zwei separate und völlig unterschiedliche Schlüssel / Werte angezeigt (ein Executor, ein Treiber). Diese können sich nicht gegenseitig überschreiben. Wenn Sie sagen, dass nur die letzte Wiederholung einer --conf-Option wirksam wird, sind Sie korrekt, aber Ihr Beispiel zeigt dies nicht. In spark-submit: - Sie können die Option One --files verwenden, von der die letzte (falls mehrere) verwendet und die frühere ignoriert wird. - Sie können mehrere Optionen --conf key = value verwenden, aber wenn Sie einen Schlüssel duplizieren es wird den letzten Wert annehmen
Penumbra
3

Ich starte meine Spark-Anwendung über einen Spark-Submit-Befehl, der in einer anderen Scala-Anwendung gestartet wird. Also habe ich ein Array wie

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

wo confValuesist:

  • für yarn-clusterModus:
    "spark.driver.extraJavaOptions=-Drun.mode=production -Dapp.param=..."
  • für local[*]Modus:
    "run.mode=development"

Es ist jedoch etwas schwierig zu verstehen, wo (nicht) Anführungszeichen und Leerzeichen zu vermeiden sind. Sie können die Spark-Weboberfläche auf Systemeigenschaftswerte überprüfen.

tgpfeiffer
quelle
Das hat bei mir funktioniert! (zumindest für den local[*]Modus). Ich werde mit yarn-clusterModus versuchen und den Kommentar aktualisieren (wenn ich nicht vergesse ..: 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

Der obige Befehl funktioniert für mich:

-Denv=DEV=> um die DEV env-Eigenschaftendatei zu lesen und
-Dmode=local=> um SparkContext in local - .setMaster ("local [*]") zu erstellen

Yoga Gowda
quelle
0

Verwenden Sie die Methode wie im folgenden Befehl, kann für Sie hilfreich sein -

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

Ich habe es versucht und es hat bei mir funktioniert. Ich würde vorschlagen, dass Sie auch die Überschrift unter Spark Post durchgehen, was wirklich hilfreich ist - https://spark.apache.org/docs/latest/running-on-yarn.html

Nitesh Saxena
quelle
0

Ich hatte ursprünglich diese Konfigurationsdatei:

my-app {
  environment: dev
  other: xxx
}

So lade ich meine Konfiguration in meinen Spark-Scala-Code:

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

Bei diesem Setup funktionierte die Überschreibung der Systemeigenschaften trotz der Angaben in der Typesafe Config-Dokumentation und aller anderen Antworten nicht, als ich meinen Spark-Job wie folgt startete:

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

Damit es funktioniert, musste ich meine Konfigurationsdatei ändern in:

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

und starten Sie es dann so:

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
quelle
Ich laufe Funke 1.6.0 BTW
nemo