2014-06-05 5 views
9

Ich habe einen kleinen Cluster mit 3 Maschinen, und eine andere Maschine zum Entwickeln und Testen. Bei der Entwicklung setze ich SparkContext auf local. Wenn alles in Ordnung ist, möchte ich die Jar-Datei bereitstellen, die ich auf jedem Knoten erstellt habe. Grundsätzlich verschiebe ich dieses jar manuell zu cluster und kopiere es in HDFS, das vom Cluster geteilt wird. Dann könnte ich den Code ändern:Wie kann ich meinen Jar für Spark Cluster im Standalone-Modus einfacher bereitstellen?

//standalone mode 
val sc = new SparkContext(
    "spark://mymaster:7077", 
    "Simple App", 
    "/opt/spark-0.9.1-bin-cdh4", //spark home 
    List("hdfs://namenode:8020/runnableJars/SimplyApp.jar") //jar location 
) 

, um es in meiner IDE zu starten. Meine Frage: Ist es einfacher, dieses Jar in den Cluster zu verschieben?

Antwort

23

In Spark wird das Programm, das den SparkContext erstellt, 'der Treiber' genannt. Es ist ausreichend, dass die JAR-Datei mit Ihrem Job dem lokalen Dateisystem des Treibers zur Verfügung steht, damit er sie abholen und an den Master/Worker senden kann.

Konkret wird der Config wie folgt aussehen:

//favor using Spark Conf to configure your Spark Context 
val conf = new SparkConf() 
      .setMaster("spark://mymaster:7077") 
      .setAppName("SimpleApp") 
      .set("spark.local.ip", "172.17.0.1") 
      .setJars(Array("/local/dir/SimplyApp.jar")) 

val sc = new SparkContext(conf) 

Unter der Haube wird der Fahrer einen Server starten, wo die Arbeiter von dem Fahrer die JAR-Datei (en) wird heruntergeladen. Es ist daher wichtig (und häufig ein Problem), dass die Arbeiter Netzwerkzugriff auf den Fahrer haben. Dies kann oft dadurch sichergestellt werden, dass "spark.local.ip" auf dem Treiber in einem Netzwerk festgelegt wird, das für die Worker zugänglich/routbar ist.

+4

Sie können 'SparkContext.jarOfClass (this.getClass)' anstelle von '' Array ("/ local/dir/SimplyApp.jar") verwenden. – samthebest

+2

@samthebest Diese Methode bestimmt das Jar, aus dem die angegebene Klasse geladen wurde und funktioniert gut für Abhängigkeiten, funktioniert aber möglicherweise nicht für die Treiberklasse, die in einer IDE nicht aus einer JAR geladen wurde. Am einfachsten ist es, einen Uberjar mit Maven Shade oder SBT Assembly zu bauen und dies als einzigartige Abhängigkeit bereitzustellen. – maasg

+2

Nur FWIW diese Antwort hängt davon ab, die Standardeinstellung für --deploy-mode zu akzeptieren, der Client ist, wenn Sie --deploy-mode Cluster verwenden, dann wissen Sie nicht, auf welchem ​​Arbeiterknoten der Treiber ausgeführt wird, also tun Sie es Sie müssen diese Jars für alle Mitarbeiter sichtbar machen, da das Advanced Dependency Management ohnehin eine gute Idee ist, da es den Netzwerkverkehr reduziert. http://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management. Auch die Gläser werden nicht an den Master versandt, da der Master nicht mit dem Code beschäftigt ist, sondern nur die Programmierung von Code "Anwendungen" in Spark – JimLohse

Verwandte Themen