Stimmt ... es wurde ziemlich viel diskutiert.
Es gibt jedoch viele Unklarheiten und einige der Antworten ... einschließlich des Duplizierens von JAR-Referenzen in der JAR- / Executor- / Treiberkonfiguration oder in den Optionen.
Die mehrdeutigen und / oder ausgelassenen Details
Nach Unklarheiten sollten für jede Option unklare und / oder ausgelassene Details geklärt werden:
- Wie ClassPath betroffen ist
- Treiber
- Executor (für laufende Aufgaben)
- Beide
- keineswegs
- Trennzeichen: Komma, Doppelpunkt, Semikolon
- Wenn angegeben, werden Dateien automatisch verteilt
- für die Aufgaben (an jeden Testamentsvollstrecker)
- für den Remote-Treiber (wenn im Cluster-Modus ausgeführt)
- Art der akzeptierten URI: lokale Datei, HDFS, http usw.
- Wenn an einen gemeinsamen Speicherort kopiert , wo befindet sich dieser Speicherort (hdfs, local?)
Die Optionen, auf die es sich auswirkt:
--jars
SparkContext.addJar(...)
MethodeSparkContext.addFile(...)
Methode--conf spark.driver.extraClassPath=...
oder--driver-class-path ...
--conf spark.driver.extraLibraryPath=...
, oder--driver-library-path ...
--conf spark.executor.extraClassPath=...
--conf spark.executor.extraLibraryPath=...
- Nicht zu vergessen, der letzte Parameter des Spark-Submit ist ebenfalls eine JAR-Datei.
Mir ist bekannt, wo ich die Hauptdokumentation zu Spark finden kann , und insbesondere, wie ich sie einreichen soll , welche Optionen verfügbar sind und auch JavaDoc . Das ließ mir jedoch noch einige Löcher, obwohl es teilweise auch antwortete.
Ich hoffe, dass es nicht so komplex ist und dass mir jemand eine klare und präzise Antwort geben kann.
Wenn ich aus der Dokumentation raten würde, scheint es so --jars
, und die Methoden SparkContext
addJar
und addFile
sind diejenigen, die automatisch Dateien verteilen, während die anderen Optionen lediglich den ClassPath ändern.
Wäre es sicher anzunehmen, dass ich der Einfachheit halber zusätzliche Anwendungs-JAR-Dateien hinzufügen kann, indem ich gleichzeitig die drei Hauptoptionen verwende:
spark-submit --jar additional1.jar,additional2.jar \
--driver-library-path additional1.jar:additional2.jar \
--conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar
Fand einen schönen Artikel über eine Antwort auf einen anderen Beitrag . Allerdings nichts Neues gelernt. Das Poster macht eine gute Bemerkung zum Unterschied zwischen lokalem Treiber (Garn-Client) und entferntem Treiber (Garn-Cluster). Auf jeden Fall wichtig zu beachten.
Antworten:
ClassPath:
ClassPath ist abhängig von Ihrer Bereitstellung betroffen. Es gibt verschiedene Möglichkeiten, etwas auf den Klassenpfad zu setzen:
spark.driver.extraClassPath
oder es ist ein Alias--driver-class-path
, zusätzliche Klassenpfade auf dem Knoten festzulegen, auf dem der Treiber ausgeführt wird.spark.executor.extraClassPath
um einen zusätzlichen Klassenpfad auf den Worker-Knoten festzulegen.Wenn eine bestimmte JAR sowohl für den Master als auch für den Worker ausgeführt werden soll, müssen Sie diese in BEIDEN Flags separat angeben.
Trennungszeichen:
Befolgen Sie die gleichen Regeln wie bei der JVM :
:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
;
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
Dateiverteilung:
Dies hängt vom Modus ab, in dem Sie Ihren Job ausführen:
Client-Modus - Spark startet einen Netty-HTTP-Server, der die Dateien beim Start für jeden der Worker-Knoten verteilt. Sie können dies sehen, wenn Sie Ihren Spark-Job starten:
Cluster-Modus - Im Cluster-Modus hat spark einen führenden Worker-Knoten ausgewählt, auf dem der Treiberprozess ausgeführt werden soll. Dies bedeutet, dass der Job nicht direkt vom Master-Knoten ausgeführt wird. Hier setzt Spark keinen HTTP-Server. Sie müssen Ihre JARS manuell für alle Worker-Knoten über HDFS / S3 / andere Quellen verfügbar machen, die allen Knoten zur Verfügung stehen.
Akzeptierte URIs für Dateien
In "Einreichen von Anträgen" werden in der Spark-Dokumentation die akzeptierten Präfixe für Dateien gut erläutert:
Wie bereits erwähnt, werden JARs für jeden Worker-Knoten in das Arbeitsverzeichnis kopiert . Wo genau ist das? Es ist normalerweise unter
/var/run/spark/work
, Sie werden sie so sehen:Und wenn Sie nach innen schauen, sehen Sie alle JARs, die Sie bereitgestellt haben:
Betroffene Optionen:
Das Wichtigste, was zu verstehen ist, ist die Priorität . Wenn Sie eine Eigenschaft per Code übergeben, hat sie Vorrang vor allen Optionen, die Sie über angeben
spark-submit
. Dies wird in der Spark-Dokumentation erwähnt:Stellen Sie also sicher, dass Sie diese Werte an den richtigen Stellen einstellen, damit Sie nicht überrascht sind, wenn einer Vorrang vor dem anderen hat.
Analysieren wir jede fragliche Option:
--jars
vsSparkContext.addJar
: Diese sind identisch, nur eine wird durch Spark Submit und eine per Code gesetzt. Wählen Sie diejenige, die besser zu Ihnen passt. Eine wichtige Sache, die Sie beachten sollten, ist, dass bei Verwendung einer dieser Optionen die JAR nicht zu Ihrem Treiber- / Executor-Klassenpfad hinzugefügt wird. Sie müssen sie explizit mithilfe derextraClassPath
Konfiguration für beide hinzufügen .SparkContext.addJar
vsSparkContext.addFile
: Verwenden Sie erstere, wenn Sie eine Abhängigkeit haben , die mit Ihrem Code verwendet werden muss. Verwenden Sie Letzteres, wenn Sie einfach eine beliebige Datei an Ihre Worker-Knoten weitergeben möchten, was keine Laufzeitabhängigkeit in Ihrem Code darstellt.--conf spark.driver.extraClassPath=...
oder--driver-class-path
: Dies sind Aliase, egal welchen Sie wählen--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
Wie oben, Aliase.--conf spark.executor.extraClassPath=...
: Verwenden Sie diese Option, wenn Sie eine Abhängigkeit haben, die nicht in eine über JAR aufgenommen werden kann (z. B. weil zwischen Bibliotheksversionen Konflikte bei der Kompilierung bestehen) und die Sie zur Laufzeit laden müssen.--conf spark.executor.extraLibraryPath=...
Dies wird alsjava.library.path
Option für die JVM übergeben. Verwenden Sie diese Option, wenn Sie einen Bibliothekspfad benötigen, der für die JVM sichtbar ist.Sie können dies sicher nur für den Client-Modus und nicht für den Cluster-Modus annehmen. Wie ich schon sagte. Das von Ihnen angegebene Beispiel enthält außerdem einige redundante Argumente. Das Übergeben von JARs an
--driver-library-path
ist beispielsweise nutzlos. Sie müssen sie an übergeben,extraClassPath
wenn Sie möchten, dass sie sich auf Ihrem Klassenpfad befinden. Letztendlich möchten Sie Folgendes tun, wenn Sie externe JARs sowohl auf dem Treiber als auch auf dem Worker bereitstellen:quelle
MANIFEST.MF
Datei)?assemblyMergeStrategy
und die Klassen auszuwählen, die ich bei Konflikten benötige. Ich würde im Allgemeinen das gleiche empfehlen.--jars
Flag als auch an den Pfad der Treiber- / Executor-Klasse.zeppelin-env.sh
und hinzugefügt--jars
zuSPARK_SUBMIT_OPTIONS
. Das hat funktioniert. Das von mir verwendete URI-Format ist--jars=local:///mnt/dir/file.jar
.Ein anderer Ansatz
spark 2.1.0
besteht darin,--conf spark.driver.userClassPathFirst=true
während der Funkenübermittlung zu verwenden , wodurch die Priorität der Abhängigkeitslast und damit das Verhalten des Funkenauftrags geändert wird, indem den Gläsern Priorität eingeräumt wird, die der Benutzer mit der--jars
Option zum Klassenpfad hinzufügt .quelle
Weitere konfigurierbare Spark-Optionen für Jars und Klassenpfade im
yarn
Bereitstellungsmodus sind wie folgt:Aus der Spark-Dokumentation:
Benutzer können diesen Parameter so konfigurieren, dass sie ihre Jars angeben, die im Klassenpfad des Spark-Treibers enthalten sind.
quelle
Bei Verwendung von spark-submit mit --master yarn-cluster wird das Anwendungsglas zusammen mit allen in der Option --jars enthaltenen Gläsern automatisch in das Cluster übertragen. Nach --jars angegebene URLs müssen durch Kommas getrennt werden. Diese Liste ist in den Klassenpfaden für Treiber und Executor enthalten
Beispiel:
spark-submit --master yarn-cluster --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar
https://spark.apache.org/docs/latest/submission-applications.html
quelle
Die Verwendung ist eingeschränkt
--jars
: Wenn Sie ein Verzeichnis für den Speicherort derjar/xml
Datei angeben möchten, sind keine Verzeichniserweiterungen zulässig. Dies bedeutet, wenn Sie für jedes Glas einen absoluten Pfad angeben müssen.Wenn Sie angeben
--driver-class-path
und im Garnclustermodus ausführen, wird die Treiberklasse nicht aktualisiert. Wir können überprüfen, ob der Klassenpfad unter spark ui oder spark history server unter tab tab aktualisiert wurde oder nicht.Option, die für mich funktioniert hat, um Gläser zu übergeben, die Verzeichniserweiterungen enthalten und die im Garnclustermodus funktionieren, war die
--conf
Option. Es ist besser, Treiber- und Executor-Klassenpfade als zu übergeben--conf
, wodurch sie dem Spark-Sitzungsobjekt selbst hinzugefügt werden und diese Pfade in der Spark-Konfiguration wiedergegeben werden. Stellen Sie jedoch sicher, dass sich die Gläser im Cluster über denselben Pfad befinden.quelle
Während wir Spark-Jobs mit dem Spark-Submit-Dienstprogramm senden, gibt es eine Option
--jars
. Mit dieser Option können wir eine JAR-Datei an Spark-Anwendungen übergeben.quelle
—jar
Option gibt, wurde im Originalplakat erwähnt und in mehr als einer Antwort ausführlicher besprochen. Es scheint nicht, dass Sie etwas Neues anbieten?