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 :
- Linux: Ein Doppelpunkt
:
- z.B:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: Ein Semikolon
;
- z.B:
--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:
16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server
16/05/08 17:29:12 INFO Utils: Successfully started service 'HTTP file server' on port 58922.
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
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:
Bei Verwendung von spark-submit wird das Anwendungsglas zusammen mit allen in der Option --jars enthaltenen Gläsern automatisch in den Cluster übertragen. Spark verwendet das folgende URL-Schema, um verschiedene Strategien für die Verbreitung von Gläsern zu ermöglichen:
- Datei: - Absolute Pfade und Datei: / URIs werden vom HTTP-Dateiserver des Treibers bereitgestellt, und jeder Executor ruft die Datei vom HTTP-Server des Treibers ab.
- hdfs:, http:, https:, ftp: - Diese Pulldown-Dateien und JARs werden erwartungsgemäß vom URI abgerufen
- local: - Es wird erwartet, dass ein URI, der mit local: / beginnt, als lokale Datei auf jedem Arbeitsknoten vorhanden ist. Dies bedeutet, dass keine Netzwerk-E / A anfallen und gut für große Dateien / JARs geeignet sind, die an jeden Worker übertragen oder über NFS, GlusterFS usw. freigegeben werden.
Beachten Sie, dass JARs und Dateien für jeden SparkContext auf den Executor-Knoten in das Arbeitsverzeichnis kopiert werden.
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:
drwxr-xr-x 3 spark spark 4096 May 15 06:16 app-20160515061614-0027
drwxr-xr-x 3 spark spark 4096 May 15 07:04 app-20160515070442-0028
drwxr-xr-x 3 spark spark 4096 May 15 07:18 app-20160515071819-0029
drwxr-xr-x 3 spark spark 4096 May 15 07:38 app-20160515073852-0030
drwxr-xr-x 3 spark spark 4096 May 15 08:13 app-20160515081350-0031
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172020-0032
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172045-0033
Und wenn Sie nach innen schauen, sehen Sie alle JARs, die Sie bereitgestellt haben:
[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/
[*@*]$ ll
total 89988
-rwxr-xr-x 1 spark spark 801117 May 8 17:34 awscala_2.10-0.5.5.jar
-rwxr-xr-x 1 spark spark 29558264 May 8 17:34 aws-java-sdk-1.10.50.jar
-rwxr-xr-x 1 spark spark 59466931 May 8 17:34 com.mycode.code.jar
-rwxr-xr-x 1 spark spark 2308517 May 8 17:34 guava-19.0.jar
-rw-r--r-- 1 spark spark 457 May 8 17:34 stderr
-rw-r--r-- 1 spark spark 0 May 8 17:34 stdout
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:
Alle als Flags oder in der Eigenschaftendatei angegebenen Werte werden an die Anwendung übergeben und mit den über SparkConf angegebenen Werten zusammengeführt. Direkt in der SparkConf festgelegte Eigenschaften haben höchste Priorität , dann werden Flags an spark- submit oder spark-shell übergeben und anschließend Optionen in der Datei spark-defaults.conf
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
vs SparkContext.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 der extraClassPath
Konfiguration für beide hinzufügen .
SparkContext.addJar
vs SparkContext.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 als java.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.
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:
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:
spark-submit --jars additional1.jar,additional2.jar \
--driver-class-path additional1.jar:additional2.jar \
--conf spark.executor.extraClassPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar