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:
--total-executor-cores
whith spark-submit
(am wenigsten zufriedenstellend, da es keine Hinweise darauf gibt, wie der Kernpool gehandhabt wird) SPARK_WORKER_CORES
in der Konfigurationsdatei -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.
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.
--total-executor-cores
, das Sie angegeben haben, würde die gesamten Kerne begrenzen, die für diese Anwendung verfügbar sind. 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.
Tags und Links multithreading hadoop apache-spark pyspark cpu-cores