2016-11-24 3 views
4

Ich habe Spark 2.0 im Standalone-Modus ausgeführt, erfolgreich konfiguriert, um auf einem Server zu starten und war auch in der Lage, Ipython Kernel PySpark als Option in Jupyter Notebook zu konfigurieren. Alles funktioniert gut, aber ich stehe vor dem Problem, dass für jedes Notebook, das ich starte, alle meine 4 Mitarbeiter dieser Anwendung zugewiesen sind. Wenn also eine andere Person aus meinem Team versucht, ein anderes Notebook mit PySpark-Kernel zu starten, funktioniert es einfach nicht, bis ich das erste Notebook stoppe und alle Worker freigebe.Spark 2.0 Standalone-Modus Dynamic Resource Allocation Worker Startfehler

Um dieses Problem zu lösen, versuche ich den Anweisungen von Spark 2.0 Documentation zu folgen. So , auf meinem $SPARK_HOME/conf/spark-defaults.conf Ich habe die folgenden Zeilen:

spark.dynamicAllocation.enabled true 
spark.shuffle.service.enabled  true 
spark.dynamicAllocation.executorIdleTimeout 10 

Auch auf $SPARK_HOME/conf/spark-env.sh ich habe:

export SPARK_WORKER_MEMORY=1g 
export SPARK_EXECUTOR_MEMORY=512m 
export SPARK_WORKER_INSTANCES=4 
export SPARK_WORKER_CORES=1 

Aber wenn ich versuche, die Arbeiter zu starten, $SPARK_HOME/sbin/start-slaves.sh verwenden, wird nur der erste Arbeiter erfolgreich gestartet. Das Protokoll von dem ersten Arbeiter am Ende wie folgt:

16/11/24 13:32:06 INFO Worker: Successfully registered with master spark://cerberus:7077

Aber das Protokoll von den Arbeitern 2-4 zeigt mir diesen Fehler:

INFO ExternalShuffleService: Starting shuffle service on port 7337 with useSasl = false 16/11/24 13:32:08 ERROR Inbox: Ignoring error java.net.BindException: Address already in use

Es scheint (mir), dass der erste Arbeiter erfolgreich gestartet Der Shuffle-Service an Port 7337, aber die Arbeiter 2-4 "wissen davon nichts" und versuchen einen weiteren Shuffle-Service auf dem gleichen Port zu starten.

Das Problem tritt auch für alle Arbeiter (1-4) auf, wenn ich zuerst einen Shuffle-Service starte (mit $SPARK_HOME/sbin/start-shuffle-service.sh) und dann versuche, alle Arbeiter zu starten ($SPARK_HOME/sbin/start-slaves.sh).

Gibt es eine Option, um dies zu umgehen? Um sicherzustellen, dass alle Mitarbeiter sich vergewissern, dass ein Shuffle-Dienst ausgeführt wird, und eine Verbindung zu ihr herstellen, anstatt einen neuen Dienst zu erstellen?

Antwort

1

Ich hatte das gleiche Problem und schien es funktioniert durch Entfernen der spark.shuffle.service.enabled-Element aus der Konfigurationsdatei (in der Tat habe ich keine DynamicAllocation-bezogene Elemente in dort) und setzen Sie dies stattdessen im SparkConf wenn beantrage ich eine SparkContext:

sconf = pyspark.SparkConf() \ 
    .setAppName("sc1") \ 
    .set("spark.dynamicAllocation.enabled", "true") \ 
    .set("spark.shuffle.service.enabled", "true") 
sc1 = pyspark.SparkContext(conf=sconf) 

beginne ich den Master & Sklaven als normal:

$SPARK_HOME/sbin/start-all.sh 

Und ich habe eine Instanz des Shuffler-Dienst starten:

$SPARK_HOME/sbin/start-shuffle-service.sh 

Dann habe ich mit diesem Kontext zwei Notizbücher gestartet und beide dazu gebracht, einen kleinen Job zu machen. Die Anwendung des ersten Notebooks führt den Job aus und befindet sich im Status RUNNING, die Anwendung des zweiten Notebooks befindet sich im Status WAITING. Nach einer Minute (standardmäßig Leerlaufzeitlimit) werden die Ressourcen neu zugewiesen und der zweite Kontext wird ausgeführt (und beide befinden sich im RUNNING-Status).

Hoffe, dass dies hilft, John