2015-09-17 7 views
119

Ich lese Cluster Mode Overview und ich kann immer noch nicht die verschiedenen Prozesse in der Spark Standalone-Cluster und die Parallelität zu verstehen.Was sind Workers, Executors, Cores im Spark Standalone-Cluster?

Ist der Mitarbeiter ein JVM-Prozess oder nicht? Ich lief die und stellte fest, dass es den Arbeiter hervorbrachte, der eigentlich eine JVM ist.

Gemäß dem obigen Link ist ein Executor ein Prozess, der für eine Anwendung auf einem Worker-Knoten gestartet wird, auf dem Tasks ausgeführt werden. Executor ist auch eine JVM.

Dies sind meine Fragen:

  1. Testamentsvollstrecker sind pro Anwendung. Was ist dann die Rolle eines Arbeiters? Koordiniert es mit dem Executor und kommuniziert das Ergebnis an den Fahrer zurück? oder spricht der Fahrer direkt mit dem Executor? Wenn ja, was ist der Zweck des Arbeitnehmers?

  2. Wie kann die Anzahl der Executoren für eine Anwendung gesteuert werden? 3. Können die Aufgaben im Executor parallel ausgeführt werden? Wenn ja, wie konfiguriert man die Anzahl der Threads für einen Executor?

  3. Wie ist die Beziehung zwischen Worker, Executoren und Executor-Kernen (--Total-Executor-Cores)?

  4. Was bedeutet es, mehr Arbeiter pro Knoten zu haben?

Aktualisiert besser

Lets Beispiele nehmen zu verstehen.

Beispiel 1: Ein eigenständiges Cluster mit 5 Arbeitern Knoten (jeder Knoten mit 8 Kernen) Wenn i eine Anwendung mit Standardeinstellung starten.

Beispiel 2 gleiche Cluster-Konfiguration wie in Beispiel 1, aber ich führe eine Anwendung mit den folgenden Einstellungen --executor-Kern 10 --total-Exekutor-Kern 10.

Beispiel 3 gleiche Cluster-Konfiguration wie in Beispiel 1, aber ich führe eine Anwendung mit den folgenden Einstellungen --executor-Kern 10 --total-Exekutor-Kern 50.er

E xample 4 gleichen Cluster-Konfiguration wie in Beispiel 1, aber ich führen eine Anwendung mit den folgenden Einstellungen --executor-Kerne 50 --total-Exekutor-Kerne 50.

Beispiel 5 gleichen Cluster wie Config 1 Beispiel, aber ich führen eine Anwendung mit den folgenden Einstellungen --executor-Kerne 50 --total-Executor-Kerne 10.

In jedem dieser Beispiele, Wie viele Vollstrecker?Wie viele Threads pro Executor? Wie viele Kerne? Wie wird die Anzahl der Executoren pro Anwendung entschieden? Ist es immer dasselbe wie die Anzahl der Arbeiter?

Antwort

146

enter image description here

Funken verwendet eine Master/Slave-Architektur. Wie Sie in der Abbildung sehen können, hat es einen zentralen Koordinator (Treiber), der mit vielen verteilten Arbeitern (Executoren) kommuniziert. Der Treiber und jeder der Executoren läuft in eigenen Java-Prozessen.

DRIVER

Der Treiber ist der Prozess, in dem die Hauptverfahren ausgeführt wird. Zuerst konvertiert es das Benutzerprogramm in Aufgaben und danach plant es die Aufgaben auf den Executoren.

TESTAMENTSVOLLSTRECKER

Testamentsvollstrecker sind Prozesse Arbeitnehmer Knoten verantwortlich für in einem bestimmten Funkenjob einzelne Aufgaben ausgeführt werden. Sie werden zu Beginn einer Spark-Anwendung gestartet und normalerweise für die gesamte Lebensdauer einer Anwendung ausgeführt. Sobald sie die Aufgabe ausgeführt haben, senden sie die Ergebnisse an den Fahrer. Sie bieten auch speicherinternen Speicher für RDDs, die von Benutzerprogrammen über Block Manager zwischengespeichert werden.

ANWENDUNG EXECUTION FLOW

In diesem Sinne, wenn Sie eine Anwendung auf dem Cluster mit einreichen funken einreichen das ist, was intern passiert:

  1. Eine eigenständige Anwendung gestartet und instanziiert ein SparkContext Instanz (und nur dann, wenn Sie die Anwendung einen Treiber aufrufen können).
  2. Das Treiberprogramm fragt nach Ressourcen zum Cluster-Manager, um die Executoren zu starten.
  3. Der Cluster-Manager startet die Executoren.
  4. Der Treiberprozess wird durch die Benutzeranwendung ausgeführt. Abhängig von den Aktionen und Transformationen über RDDs werden die Aufgaben an die Executoren gesendet.
  5. Ausführende führen die Aufgaben aus und speichern die Ergebnisse.
  6. Wenn ein Mitarbeiter abstürzt, werden seine Aufgaben an verschiedene Executoren gesendet, um erneut verarbeitet zu werden. In dem Buch „Lernen Funke: Blitzschnelle Big Data Analysis“ sie sprechen über Funken- und Fehlertoleranz:

Funken befasst sich automatisch mit ausgefallenen oder langsamen Maschinen durch erneute Ausführung fehlgeschlagen ist oder langsam Aufgaben. Wenn beispielsweise der Knoten, auf dem eine Partition einer map() -Operation ausgeführt wird, abstürzt, wird er von Spark auf einem anderen Knoten erneut ausgeführt. und selbst wenn der Knoten nicht abstürzt, sondern einfach viel langsamer ist als andere Knoten, kann Spark eine "spekulative" Kopie der Aufgabe auf einem anderen Knoten präventiv starten und das Ergebnis übernehmen, wenn das beendet ist.

  1. Mit SparkContext.stop() von dem Fahrer oder wenn die Hauptmethode Ausfahrten/stürzt alle Vollstrecker werden beendet und die Cluster-Ressourcen durch den Cluster-Manager freigegeben werden.

IHRE FRAGEN

  1. Als Testamentsvollstrecker gestartet werden sie sich mit dem Fahrer zu registrieren und so auf sie direkt miteinander kommunizieren. Die Mitarbeiter sind dafür verantwortlich, dem Cluster-Manager die Verfügbarkeit ihrer Ressourcen mitzuteilen.

  2. In einem YARN-Cluster können Sie das mit --num-executors machen. In einem Standalone-Cluster erhalten Sie einen Executor pro Worker, es sei denn, Sie spielen mit spark.executor.cores und ein Worker hat genug Kerne, um mehr als einen Executor zu halten. (Wie @JacekLaskowski wies darauf hin, --num-Vollstrecker ist nicht mehr in Gebrauch in GARN https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66)

  3. Sie können die Anzahl der Kerne pro Testamentsvollstrecker mit --executor-Kern

  4. zuordnen --total- Executor-Cores ist die maximale Anzahl von Executor-Kernen pro Anwendung

  5. Wie Sean Owen in dieser sagte: "Es gibt keinen guten Grund, mehr als einen Arbeiter pro Maschine zu betreiben". Sie würden viele JVM zum Beispiel in einer Maschine sitzen haben.

UPDATE

Ich habe nicht in der Lage gewesen, diese Szenarien zu testen, aber nach Dokumentation:

Beispiel 1: Spark gierig so viele Kerne und Testamentsvollstrecker erwerben wie sind vom Scheduler angeboten. Am Ende erhalten Sie 5 Executoren mit je 8 Kernen.

BEISPIEL 2 bis 5: Spark kann nicht so viele Kerne zuweisen, wie in einem einzelnen Worker angefordert, daher werden keine Executoren gestartet.

+0

Dank @Marco. In der Regel sollte man sich also nicht um den Heap-Speicher des Arbeiters kümmern, da er nur die Knotenressourcen verwaltet. – learninghuman

+0

Sie sollten mit spark.executor.memory arbeiten und sicherstellen, dass es Ihre Funken Arbeiter Speicher passt – Marco

+4

Was für eine großartige Antwort! Danke @Marco. Https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66 '--num-executors 'werden in YARN nicht mehr verwendet. –

Verwandte Themen