Von ORDIX AG auf Dienstag, 24. September 2019
Kategorie: Data Management

(PySpark) on YARN - Behind the Scenes (Teil 2)

In Teil eins wurde gezeigt, welche YARN Container und welche Linux Prozesse beim Aufruf der Spark Shell gestartet werden. Im zweiten Teil dieses Beitrags führt Olaf Hein aus, wie die Python Shell mit PySpark gestartet wird.

Python + Spark

Im letzten Beispiel wurde die Spark Shell für Scala verwendet. Bei der Verwendung von Python werden zusätzliche Prozesse gestartet. Für einen ersten Test wird die Python Shell mit pyspark2 gestartet:

Danach werden mit ps die Prozesse des Benutzers cloudera angezeigt:  

Für den Benutzer cloudera werden wieder zwei neue Linux Prozesse auf dem Edge Node gestartet. Zuerst wurde ein Python Prozess (PID 9630) gestartet. Dieser stellt die Python Shell bereit. Anschließend hat dieser Prozess eine Java VM gestartet (PID 9686). Der Prozessbaum für die PySpark Shell unterscheidet sich von der Scala Spark-Shell dadurch, dass zuerst ein Python Interpreter gestartet wird und keine Bash Shell:

Die YARN Prozesse werden wieder über die Application ID ermittelt:

Mit ps und grep werden die Linux Prozesse angezeigt und gefiltert:

Auch in diesem Fall werden 3 Linux Prozesse im Cluster gestartet. Auffällig ist, dass es im Cluster noch keinen Python Prozess gibt.

Erst bei der Verarbeitung von Spark Tasks im Cluster werden von YARN Executor Prozesse gestartet. Im Fall von PySpark laufen dann auch Python Prozesse im Betriebssystem des Worker Nodes. Mit dem folgenden Spark Script lässt sich das leicht testen:

Der Befehl yarn container -list zeigt jetzt einen zweiten Container:

Die Prozesse können wieder mit dem ps Kommando angezeigt werden. Die Python Prozesse können allerdings nicht über grep und die Application ID gefunden werden, da die ID nicht als Argument über die Kommandozeile übergeben wird. In einem kleinen Cluster können einfach alle Prozesse des Benutzers yarn angezeigt werden. In größeren Clustern ist es einfacher nach den PPIDs zu suchen. Es folgt die Prozessliste der beiden gestarteten YARN Container. Damit es übersichtlicher wird, wurde in diesem Fall die Ausgabe abgeschnitten und mit # wurden Kommentare eingefügt.  

Die Prozesse des ApplicationMasters existieren wie zuvor. Für den Executor wurden zusätzliche Prozesse gestartet. Da PySpark verwendet wird, werden in diesem Fall auch Python Prozesse gestartet. Das sind die Prozesse mit den PIDs 18859 und 18888.

Nachdem die Spark Tasks beendet wurden, d.h. nachdem collect() ausgeführt wurde, werden der Container für den Executor und damit auch alle Prozesse im Betriebssystem beendet.

Hier der vereinfachte Prozessbaum der im YARN Cluster gestarteten Prozesse:

Fortsetzung

Im dritten Teil geht Olaf Hein auf die Verwendung unterschiedlicher Python Versionen ein.

Kommentare hinterlassen