Apache spark, spark-submit, was ist das Verhalten der Option --total-executor-cores

9

Ich führe einen Spark-Cluster über C ++ - Code, der in Python eingebunden ist. Ich teste gerade verschiedene Konfigurationen von Multi-Threading-Optionen (auf Python-Level oder Spark-Level).

Ich verwende Spark mit eigenständigen Binärdateien über einen HDFS 2.5.4-Cluster. Der Cluster besteht derzeit aus 10 Slaves mit je 4 Kernen.

Von dem, was ich sehen kann, startet Spark standardmäßig 4 Slaves pro Knoten (ich habe 4 Python gleichzeitig auf einem Slave-Knoten).

Wie kann ich diese Nummer begrenzen? Ich kann sehen, dass ich eine Option --total-executor-cores für "spark-submit" habe, aber es gibt wenig Dokumentation darüber, wie sie die Verteilung von Executoren über den Cluster beeinflusst!

Ich werde Tests durchführen, um eine klare Idee zu bekommen, aber wenn jemand weiß, was diese Option macht, könnte das helfen.

Aktualisierung:

Ich bin noch einmal durch die Funken Dokumentation gegangen, hier ist was ich verstehe:

  • Standardmäßig habe ich einen Executor pro Worker-Knoten (hier 10 Worker-Knoten, also 10 Executoren)
  • Jeder Mitarbeiter kann jedoch mehrere Aufgaben parallel ausführen . Im Standalone-Modus ist das Standardverhalten, alle verfügbaren Kerne zu verwenden, was erklärt, warum ich 4 Python beobachten kann.
  • Um die Anzahl der Kerne, die pro Arbeiter verwendet werden, zu begrenzen und die Anzahl der parallelen Aufgaben zu begrenzen, habe ich mindestens 3 Optionen:
    • Verwenden Sie --total-executor-cores whith spark-submit (am wenigsten zufriedenstellend, da es keine Hinweise darauf gibt, wie der Kernpool gehandhabt wird)
    • Verwenden Sie SPARK_WORKER_CORES in der Konfigurationsdatei
    • Verwenden Sie -c Optionen mit den Startskripten

Die folgenden Zeilen dieser Dokumentation Ссылка haben mir geholfen, herauszufinden, was vor sich geht:

  

SPARK_WORKER_INSTANCES
  Anzahl der Worker-Instanzen, die auf jedem Computer ausgeführt werden sollen (Standard: 1).   Sie können dies zu mehr als 1 machen, wenn Sie sehr große Maschinen haben und mehrere Spark-Worker-Prozesse möchten.   Wenn Sie dies festlegen, stellen Sie sicher, dass SPARK_WORKER_CORES auch explizit auf die Kerne pro Worker beschränkt ist, da andernfalls jeder Worker versucht, alle Kerne zu verwenden.

Was mir immer noch unklar ist, ist, warum es in meinem Fall besser ist, die Anzahl der parallelen Aufgaben pro Worker-Knoten auf 1 zu begrenzen und sich auf meinen C ++ - Legacy-Code Multithreading zu verlassen. Ich werde diesen Beitrag mit den Versuchsergebnissen aktualisieren, wenn ich meine Studie beende.

    
MathiasOrtner 04.05.2015, 13:19
quelle

2 Antworten

2

Um sicherzustellen, wie viele Worker bei jedem Slave gestartet wurden, öffnen Sie den Webbrowser, geben Sie Ссылка ein und sehen Sie sich den Abschnitt workers an viele Arbeiter wurden genau gestartet, und auch welcher Arbeiter auf welchem ​​Sklaven. (Ich erwähne diese oben, weil ich nicht sicher bin, was du damit meinst, indem du '4 Sklaven pro Knoten' sagst)

Standardmäßig würde funken genau 1 Arbeiter auf jedem Slave starten, wenn Sie nicht angeben SPARK_WORKER_INSTANCES=n in conf / spark-env.sh, wobei n die Nummer der Worker-Instanz ist, die Sie auf jedem -Slave starten möchten.

Wenn Sie einen Spark-Job über die Spark-Submission senden, startet Spark einen Anwendungstreiber und mehrere Executoren für Ihren Job.

  • Wenn nicht eindeutig angegeben, würde spark einen Executor für jeden Worker starten, d. h. die gesamte Executor-Nummer ist gleich der gesamten Worknummer und alle Kerne wären für diesen Job verfügbar.
  • --total-executor-cores , das Sie angegeben haben, würde die gesamten Kerne begrenzen, die für diese Anwendung verfügbar sind.
Yijie Shen 04.05.2015 15:22
quelle
1

Die Dokumentation scheint nicht klar.

Aus meiner Erfahrung besteht die gängigste Vorgehensweise darin, die Anzahl der Executoren und die Anzahl der Kerne pro Executor anzugeben (z. B. aus hier ):

%Vor%

Dieser Ansatz ist jedoch auf YARN beschränkt und gilt nicht für Standalone- und mesosbasierte Spark , nach das .

Stattdessen kann der Parameter --total-executor-cores verwendet werden, der die Gesamtanzahl der Kerne - aller Executoren - darstellt, die dem Spark Job zugewiesen sind. In Ihrem Fall, mit insgesamt 40 Kernen, würde die Einstellung des Attributs --total-executor-cores 40 alle verfügbaren Ressourcen nutzen.

Leider ist mir nicht bekannt, wie Spark die Arbeitslast verteilt, wenn weniger Ressourcen zur Verfügung stehen als die verfügbare Gesamtmenge. Wenn Sie jedoch mit zwei oder mehr gleichzeitigen Jobs arbeiten, sollte dies für den Benutzer transparent sein, da Spark (oder welcher Ressourcenmanager) die Verwaltung der Ressourcen abhängig von den Benutzereinstellungen verwalten würde.

    
Mikel Urkia 04.05.2015 15:30
quelle