2016-07-25 10 views
1

Liebe Mitbürger Apache Spark-EnthusiastenApache Spark - Wie langsam Aufgaben

Ich trat vor kurzem ein Nebenprojekt mit dem Ziel, dreht ein paar ODROID XU4 Computer in einen Stand-alone-Spark-Cluster aus vermeiden versagen.

Nach dem Einrichten des Clusters stieß ich auf ein Problem, das spezifisch für heterogene Multiprozessoren zu sein scheint. Spark-Executor-Tasks laufen auf der XU4 extrem langsam, wenn alle 8 Prozessoren verwendet werden. Der Grund, wie in einem Kommentar zu meinem Post unten erwähnt, ist, dass Spark nicht auf die Executoren wartet, die auf den langsamen Prozessoren gestartet wurden.

http://forum.odroid.com/viewtopic.php?f=98&t=21369&sid=4276f7dc89a8d7825320e7f705011326&p=152415#p152415

Eine Lösung ist weniger Testamentsvollstrecker Kerne zu verwenden und die CPU-Affinität setzen nicht die kleinen Prozessoren zu verwenden. Dies ist jedoch eine weniger als ideale Lösung.

Gibt es eine Möglichkeit, Spark zu bitten, etwas länger auf Feedback von langsameren Executoren zu warten? Offensichtlich zu lange warten wird sich negativ auf die Leistung auswirken. Der positive Effekt der Verwendung aller Kerne sollte jedoch den negativen Effekt ausgleichen.

Vielen Dank im Voraus für jede Hilfe!

Antwort

1

@Dikei Antwort zeigt zwei mögliche Ursachen, aber es stellt sich heraus, das Problem ist nicht das, was er vermutet. Ich habe die gleiche Einstellung wie die @ TJVR, und es stellt sich heraus, dass der Treiber Heartbeats von Executoren fehlt.Um dem abzuhelfen, habe ich folgendes spark-env.sh:

export SPARK_DAEMON_JAVA_OPTS="-Dspark.worker.timeout=600 -Dspark.akka.timeout=200 -Dspark.shuffle.consolidateFiles=true" 
export SPARK_JAVA_OPTS="-Dspark.worker.timeout=600 -Dspark.akka.timeout=200 -Dspark.shuffle.consolidateFiles=true" 

Dies ändert die Standard-Timeouts für Testamentsvollstrecker Herzschläge. Setzen Sie auch spark.shuffle.consolidateFiles auf "true", um die Leistung auf meinem ext4-Dateisystem zu verbessern. Diese Standardänderungen ermöglichten es mir, die Kernnutzung über einen zu erhöhen und nicht häufig die Executoren zu verlieren.

+0

Großartiger Fund @claireware. Ich habe die Einstellungen übernommen und erziele eine viel bessere Leistung, auch wenn 8 Kerne verwendet werden. Es scheint jedoch 2 - 3 ist die sicherste Nummer zu verwenden. – TJVR

+0

@TJVR Die Verwendung von mehr Kernen erfordert mehr RAM-Overhead, und auf der 2-GB-XU4-Platine kann dies erheblich sein. Wenn Sie mit einem großen Dataset arbeiten, habe ich festgestellt, dass ich am besten zu 1 Core zurückwähle, damit mehr RAM für die Berechnungen zur Verfügung steht. Allerdings habe ich 2-3 Kerne für kleine Datensätze erstellt. – kamprath

1

Funke nicht tötet langsam Vollstrecker, sondern einen Testamentsvollstrecker als tot in zwei Fällen markieren: Der Vollstrecker:

  1. Wenn der Fahrer kein Herzschlagsignal in eine Zeit lang (: 120s Standard) erhält muss regelmäßig (Standard: 10s) eine Heartbeat-Nachricht senden, um den Treiber zu benachrichtigen, dass er noch am Leben ist. Netzwerkprobleme oder eine große GC-Pause können diesen Herzschlag verhindern.

  2. Der Executor ist aufgrund einer Ausnahme im Code oder JVM-Laufzeitfehler abgestürzt, höchstwahrscheinlich auch wegen GC-Pause.

Meiner Meinung nach, ist es wahrscheinlich, dass GC Overhead hat, hat Ihr verlangsamten Testamentsvollstrecker und der Fahrer getötet die Aufgabe, auf einem anderen Testamentsvollstrecker zu wiederholen. Wenn dies der Fall ist, können Sie versuchen, Ihre Daten in kleinere Partitionen aufzuteilen, sodass jeder Executor weniger Daten gleichzeitig verarbeiten muss.

Zweitens sollten Sie spark.speculation NICHT auf "True" setzen, ohne zu testen. Es ist aus einem bestimmten Grund "falsch", ich habe gesehen, dass es in manchen Fällen mehr schadet als nützt.

Schließlich könnte die folgende Annahme nicht wahr sein.

Der positive Effekt der Verwendung aller Kerne sollte jedoch den negativen Effekt ausgleichen .

Langsame Executoren (Straggles) können dazu führen, dass das Programm je nach Auslastung wesentlich schlechter abläuft. Es ist durchaus möglich, dass das Vermeiden der langsamen Kerne das beste Ergebnis liefert.

+0

Hallo Dikei Danke für die Erkenntnisse. Ich werde kleinere Jobs versuchen, um zu sehen, ob das das Problem löst. Da jeder der 4 ODROIDXU4 4 LITTLE-Prozessoren hat, glauben Sie, dass die Verwendung dieser nicht die Analyse beschleunigen wird? Es klingt wie unter Nutzung der verfügbaren Kerne. Ich werde einige Zeit damit verbringen, verschiedene Einstellungen zu testen und dann nur eine Teilmenge von Prozessoren zu verwenden. – TJVR