2017-03-22 3 views
1

Wenn in einem Spark-Job eine JAR-Datei benötigt wird, muss sie auf zwei Arten in den Spark-Job eingefügt werden:
1. --jar path Option im Befehl.
2. SparkContext.addJar("path").
Kann mir jemand den Unterschied zwischen den beiden Möglichkeiten sagen?
Von this question, die Antwort ist sie sind identisch und nur die Priorität ist anders, aber ich denke nicht, dass es wahr ist. Wenn ich den Funke-Job im Garn-Cluster-Modus einreiche, funktioniert die Funktion addJar() nicht, wenn JAR-Dateien nicht in der Option --jars im Befehl gemäß official site enthalten sind.SparkContext.addJar funktioniert nicht im lokalen Modus

Die --jars Option ermöglicht die SparkContext.addJar Funktion zu arbeiten, wenn Sie es mit lokalen Dateien verwenden und in Garn-Cluster-Modus ausgeführt wird. Es muss nicht verwendet werden, wenn Sie es mit HDFS, HTTP, HTTPS, oder FTP-Dateien verwenden.

Der Grund ist, dass der Treiber auf einem anderen Computer als der Client ausgeführt wird. So scheint es, dass die Option --jars im Befehl vom Client ist und die Funktion addJar() kann nur auf Gläser im Treiber arbeiten.

Dann habe ich einen Test im lokalen Modus.

1. spark-shell --master local --jars path/to/jar

Wenn ich Funken Schale auf diese Weise Objekt im Glas beginnen in der Funkenschale

2. spark-shell --master local

verwendet werden, wenn ich Funken Shell starten auf diese Weise und verwenden sc.addJar("path/to/jar"), Objekte innerhalb der JAR-Datei können nicht in die Spark-Shell importiert werden und ich habe class cannot be found Fehler.

Meine Fragen sind:

Warum das Verfahren SparkContext.addJar() nicht im lokalen Modus funktioniert?

Was ist der Unterschied zwischen SparkContext.addJar() und --jars?

Meine Umgebung: Hortonworks 2.5 Cluster und Version von Spark ist 1.6.2. Ich weiß es zu schätzen, wenn irgendjemand etwas dazu aufklären kann.

Antwort

3

Nun, nach ein paar Recherchen fand ich den Grund. Einfach hier posten, wenn jemand anderes an diesem Problem beteiligt ist.

Die Methode addJar() fügt keine Jars in den Klassenpfad des Treibers ein. Die Methode besteht darin, jars im Treiberknoten zu finden, in Worker-Knoten zu verteilen und dann in den Klassenpfad des Executors zu übernehmen.
Da ich meinen Spark-Job im lokalen Modus ablege, wird Treiber-Klassenpfad (ich denke) im Funke-Job verwendet, die durch Methode addJar() hinzugefügten Gläser können nicht gefunden werden.

Um dieses Problem zu lösen, verwenden Sie --jars Option, um alle Gläser, wenn der Funke-Auftrag übergeben oder verwenden Sie --driver-class-path, um Gläser hinzufügen.
Weitere Details finden Sie here.

Verwandte Themen