Dieses Dokument gibt einen kurzen Überblick darüber, wie Spark auf Clustern ausgeführt wird, um das Verständnis der beteiligten Komponenten zu erleichtern. Lesen Sie den Leitfaden zur Antragstellung, um mehr über das Starten von Anwendungen in einem Cluster zu erfahren.
Spark-Anwendungen werden als unabhängige Prozessgruppen in einem Cluster ausgeführt, die vom SparkContext
-Objekt in Ihrem Hauptprogramm (dem so genannten Treiberprogramm) koordiniert werden.
Um auf einem Cluster ausgeführt zu werden, kann der SparkContext eine Verbindung zu verschiedenen Arten von Cluster-Managern herstellen (entweder dem eigenständigen Cluster-Manager von Spark, Mesos oder YARN), die Ressourcen anwendungsübergreifend zuweisen. Sobald die Verbindung hergestellt ist, erfasst Spark Executoren auf Knoten im Cluster, die Prozesse sind, die Berechnungen ausführen und Daten für Ihre Anwendung speichern.Als nächstes sendet es Ihren Anwendungscode (definiert durch JAR- oder Python-Dateien, die an SparkContext übergeben werden) an die Executoren. Schließlich sendet SparkContext Aufgaben zur Ausführung an die Executoren.
Es gibt einige nützliche Dinge zu dieser Architektur zu beachten:
- Jede Anwendung erhält ihre eigenen Executor-Prozesse, die für die Dauer der gesamten Anwendung aktiv bleiben und Aufgaben in mehreren Threads ausführen. Dies hat den Vorteil, dass Anwendungen sowohl auf der Planungsseite (jeder Treiber plant seine eigenen Aufgaben) als auch auf der Ausführerseite (Aufgaben aus verschiedenen Anwendungen werden in verschiedenen JVMs ausgeführt) voneinander isoliert werden. Dies bedeutet jedoch auch, dass Daten nicht für verschiedene Spark-Anwendungen (Instanzen von SparkContext) freigegeben werden können, ohne sie auf ein externes Speichersystem zu schreiben.
- Spark ist unabhängig vom zugrunde liegenden Cluster-Manager. Solange es executorprocesses erfassen kann und diese miteinander kommunizieren, ist es relativ einfach, es auch auf einem Cluster-Manager auszuführen, der auch andere Anwendungen unterstützt (z. B. Mesos / YARN).
- Das Treiberprogramm muss während seiner gesamten Lebensdauer auf eingehende Verbindungen seiner Executoren warten und diese akzeptieren (z. B. siehe spark.Treiber.port im Netzwerk configsection). Daher muss das Treiberprogramm von den Worker-Knoten aus netzwerkadressierbar sein.
- Da der Treiber Aufgaben auf dem Cluster plant, sollte er in der Nähe der Workernodes ausgeführt werden, vorzugsweise im selben lokalen Netzwerk. Wenn Sie Anforderungen remote an den Cluster senden möchten, ist es besser, einen RPC für den Treiber zu öffnen und Operationen aus der Nähe zu senden, als einen Treiber weit weg von den Arbeitsknoten auszuführen.
Cluster-Manager-Typen
Das System unterstützt derzeit mehrere Cluster-Manager:
- Standalone – ein einfacher Cluster-Manager, der in Spark enthalten ist und das Einrichten eines Clusters erleichtert.
- Apache Mesos – ein allgemeiner Cluster-Manager, der auch Hadoop MapReduce und Service-Anwendungen ausführen kann.
- Hadoop YARN – der Ressourcenmanager in Hadoop 2.
- Kubernetes – ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen.
Es gibt ein Drittanbieterprojekt (das vom Spark-Projekt nicht unterstützt wird), um Unterstützung fürNomad als Cluster-Manager hinzuzufügen.
Senden von Anwendungen
Anwendungen können mit dem Skript spark-submit
an einen Cluster eines beliebigen Typs gesendet werden.Der Leitfaden zur Einreichung von Anträgen beschreibt, wie dies zu tun ist.
Überwachung
Jedes Treiberprogramm verfügt über eine Web-Benutzeroberfläche, normalerweise auf Port 4040, die Informationen zu laufenden Tasks, Executoren und Speichernutzung anzeigt. Gehen Sie einfach in einem Webbrowser zu , um auf diese Benutzeroberfläche zuzugreifen. Der Überwachungsleitfaden beschreibt auch andere Überwachungsoptionen.
Jobplanung
Spark gibt die Kontrolle über die Ressourcenzuweisung sowohl zwischen Anwendungen (auf der Ebene des Clustermanagers) als auch innerhalb von Anwendungen (wenn mehrere Berechnungen auf demselben SparkContext ).Die Job-Scheduling-Übersicht beschreibt dies genauer.
Glossar
Die folgende Tabelle fasst Begriffe zusammen, die für Clusterkonzepte verwendet werden:
Begriff | Bedeutung |
---|---|
Anwendung | Anwenderprogramm auf Spark gebaut. Besteht aus einem Treiberprogramm und Executoren auf dem Cluster. |
Application jar | Ein JAR, das die Spark-Anwendung des Benutzers enthält. In einigen Fällen möchten Benutzer ein „Uber jar“ erstellen, das ihre Anwendung zusammen mit ihren Abhängigkeiten enthält. Die JAR des Benutzers sollte niemals Hadoop- oder Spark-Bibliotheken enthalten, diese werden jedoch zur Laufzeit hinzugefügt. |
Treiberprogramm | Der Prozess, der die main() -Funktion der Anwendung ausführt und den SparkContext erstellt |
Cluster Manager | Ein externer Dienst zum Abrufen von Ressourcen auf dem Cluster (z. B. Standalone Manager, Mesos, YARN) |
Der Bereitstellungsmodus | Unterscheidet, wo der Treiberprozess ausgeführt wird. Im „Cluster“ -Modus startet das Framework den Treiber innerhalb des Clusters. Im „Client“ -Modus startet der Übermittler den Treiber außerhalb des Clusters. |
Worker-Knoten | Jeder Knoten, der Anwendungscode im Cluster ausführen kann |
Executor | Ein für eine Anwendung auf einem Worker-Knoten gestarteter Prozess, der Aufgaben ausführt und Daten im Arbeitsspeicher oder auf der Festplatte speichert. Jede Anwendung hat ihre eigenen Executoren. |
Task | Eine Arbeitseinheit, die an einen Executor gesendet wird |
Job | Eine parallele Berechnung, die aus mehreren Aufgaben besteht, die als Reaktion auf eine Spark-Aktion erzeugt werden (z. B. save , collect ); sie sehen diesen Begriff in den Protokollen des Treibers. |
Stufe | Jeder Job wird in kleinere Gruppen von Aufgaben unterteilt, die als Stufen bezeichnet werden und voneinander abhängen (ähnlich wie die Stufen Map und Reduce in MapReduce). |