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?
Sie können 'SparkContext.jarOfClass (this.getClass)' anstelle von '' Array ("/ local/dir/SimplyApp.jar") verwenden. – samthebest
@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
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