Von ORDIX AG auf Dienstag, 01. Oktober 2019
Kategorie: Data Management

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

In Teil drei wurde gezeigt, wie unterschiedliche Python Versionen innerhalb eines Hadoop Clusters genutzt werden können. Im letzten Teil dieses Beitrags führt Olaf Hein unter anderem aus, wie mehr Sicherheit mit dem YARN-Container Executor realisiert wird.

Mehr Sicherheit mit dem YARN Container Executor 

In den bisherigen Beispielen wurden die Linux Prozesse der YARN Container als Benutzer yarn ausgeführt. Somit haben die Container im Betriebssystem auch die Rechte des Linux Benutzers yarn. Das ist ein generelles Sicherheitsproblem. Über die Spark Shell erhalten Benutzer somit Zugriff auf das Betriebssystem der Worker Knoten im Cluster. Das ist insbesondere problematisch, da über die Spark Shell, zum Beispiel mit Jupyter Notebooks, interaktiv mit dem Cluster gearbeitet wird. Auch wenn ein böswilliger Angriff unwahrscheinlich wäre, können durch Unachtsamkeit oder Unwissenheit der Anwender Probleme verursacht werden.

Mit dem folgenden kurzen Spark Script kann zum Beispiel schreibend auf Dateien im Betriebssystem des Worker Nodes zugegriffen werden, auf dem der Spark Executor Prozess gestartet wurde.

Im Betriebssystem wird dadurch eine Datei geschrieben, die dem Benutzer yarn gehört:

Mit welchen Benutzerprivilegien die Prozesse des Executors gestartet werden, kann mit dem folgenden Parameter in der core-site.xml festgelegt werden:

Die Default Einstellung ist die Klasse DefaultContainerExecutor. Wird der DefaultContainerExecutor verwendet, dann werden neue Container mit dem Benutzer gestartet, mit dem der NodeManager gestartet wurde. Üblicherweise ist das der Benutzer yarn.

Eine weitere Option ist der Wert LinuxContainerExecutor.

In einem ungesicherten Cluster (d.h. ein Cluster ohne Kerberos), kann mit dem LinuxContainerExcutor dafür gesorgt werden, dass die Prozesse der YARN Container im Linux nicht mehr mit dem Benutzer yarn gestartet werden. Es gibt zwei Optionen:

In einem ungesicherten Cluster sorgt der LinuxContainerExcutor für eine Trennung der Container Prozesse im Betriebssystem vom Hadoop System selbst. Eine verlässliche Absicherung des Clusters ist allerdings nur zusammen mit Kerberos möglich.

LinuxContainerExecutor mit Kerberos Authentifizierung 

In einem abgesicherten Cluster wird Kerberos für die Authentifizierung der Benutzer verwendet. Der LinuxContainerExecutor sorgt in diesem Fall für eine zuverlässige Trennung der Container Prozesse im Betriebssystem vom Rest des Systems. Weiterhin werden die Prozesse der verschiedenen Benutzer des Clusters sauber voneinander getrennt. Der verwendete container-executor wird in der yarn-site.xml konfiguriert:

Wird der LinuxContainerExecutor verwendet, dann wird zusätzlich die Konfigurationsdatei container-executor.cfg benötigt. Die Dabei enthält Variablen, deren Einstellungen von der Cluster Konfiguration abhängen. Im Folgenden wird die Konfigurationsdatei gezeigt (die mit # markierte Kommentare sind nicht Teil der Datei):

Der Benutzer yarn ist bewusst ausgeschlossen. Damit wird zuverlässig verhindert, dass Container Prozesse mit den yarn Rechten ausgeführt werden.

Wird eine YARN Applikation, zum Beispiel durch den Start der Spark Shell, gestartet, dann werden die Prozesse der Container im Betriebssystem mit dem Benutzer des Kerberos Principals ausgeführt. Im folgenden Beispiel wird eine Spark Shell mit dem Benutzer cloudera gestartet. Im Betriebssystem wird anschließend überprüft, mit welchen Rechten die Applikationen bzw. Prozesse ausgeführt werden.

In einem zweiten Terminal wird überprüft, welche Prozesse mit welchem Benutzer ausgeführt werden.

Als Benutzer wird cloudera angezeigt. Das ist der Benutzer, dessen Rechte innerhalb von Hadoop genutzt werden um auf Ressourcen, wie zum Beispiel Dateien und Verzeichnisse im HDFS, zuzugreifen.

Im Linux Betriebssystem werden die folgenden Prozesse für die Application ID ausgeführt:

Der Container Executor wird weiterhin mit dem Benutzer yarn ausgeführt. Beim Einsatz des LinuxContainerExecutors ist es aber kein Bash Script, sondern eine native Linux Anwendung. Die Container selbst werden jetzt mit dem Benutzer cloudera gestartet.

Zu beachten ist, dass Hadoop in einem sicheren Cluster nur den Namen aus dem Kerberos Principal betrachtet. Dieser Name wird vom LinuxContainerExecutor verwendet, um die Prozesse der YARN Container im Betriebssystem zu starten. Des Weiteren können über diesen Namen Ressourcen innerhalb des Hadoop Clusters (HDFS Dateien, Hive Tabellen, etc.) autorisiert werden. Über Auth-to-Local Regeln kann in Hadoop konfiguriert werden, wie genau der Name des Kerberos Principals auf Hadoop Benutzernamen gemappt wird. Details dazu würden aber den Rahmen dieses Artikels sprengen.

Fazit

Bei der Ausführung von Spark bzw. PySpark Jobs in einem YARN Cluster müssen einige Besonderheiten beachtet werden. Für die Cluster Installation und Konfiguration ist es notwendig zu verstehen, wann YARN welche Prozesse startet und was dabei im Linux Betriebssystems geschieht ist. Die wichtigsten Punkte sind:

Weitere Details werden in der Dokumentation von Hadoop und Spark beschrieben.

Kommentare hinterlassen