Mit spark-submit,, was ist das Verhalten von den-total-executor-Kerne option?
Mir läuft ein spark-cluster über C++ - code, verpackt in python.
Ich bin derzeit am testen der verschiedenen Konfigurationen von multi-threading-Optionen (auf Python-Ebene oder Spark-Ebene).
Bin ich mit spark mit standalone binaries, die über einen HDFS-2.5.4-cluster. Der cluster besteht derzeit aus 10 Sklaven, mit 4 Kernen jeder.
Aus, was ich sehen kann, standardmäßig, Spark startet 4 slaves pro Knoten (ich habe 4 python arbeiten auf einem slave-Knoten zu einem Zeitpunkt).
Wie kann ich den Grenzwert dieser Reihe ? Ich kann sehen, dass ich eine-total-executor-Kerne option für "spark-submit", aber es gibt wenig Dokumentation darüber, wie es Auswirkungen auf die Verteilung der Testamentsvollstrecker über den cluster !
Werde ich tests ausführen, um eine klare Idee, aber wenn jemand kenntnisreich hat eine Ahnung, was diese option tut, könnte es helfen.
Update :
Ging ich durch spark-Dokumentation wieder, hier ist, was ich verstehe :
- Standardmäßig, ich habe ein Testamentsvollstrecker pro worker-Knoten (hier 10 Arbeiter-Knoten, also 10 Vollzieher)
- Jedoch, jedem Arbeiter ausgeführt werden kann mehrere Aufgaben parallel. Im standalone-Modus, der standardmäßig alle verfügbaren Kerne, was erklärt, warum kann ich beobachten 4 python.
- Um die Anzahl der verwendeten Kerne pro Arbeitnehmer, und begrenzen Sie die Anzahl der parallelen Aufgaben, ich habe mindestens 3 Optionen :
- verwenden
--total-executor-cores
mitspark-submit
(mindestens befriedigend, da es keine Ahnung, wie sich der pool der Kerne behandelt wird) - verwenden
SPARK_WORKER_CORES
in der Konfigurationsdatei - verwenden
-c
Optionen mit den Start-scripts
- verwenden
Den folgenden Zeilen dieser Dokumentation http://spark.apache.org/docs/latest/spark-standalone.html hat mir geholfen, herauszufinden, was Los ist :
SPARK_WORKER_INSTANCES
Anzahl der worker-Instanzen laufen auf jeder Maschine (Standard: 1).
Sie können diese mehr als 1, wenn die Sie haben sehr große Maschinen und würde gerne mehrere Spark-worker-Prozesse.
Wenn Sie diese, stellen Sie sicher, auch zu setzen SPARK_WORKER_CORES explizit zur Begrenzung der Kerne pro Arbeitnehmer, oder sonst jeder Arbeitnehmer wird versuchen, alle Kerne.
Was ist mir noch immer unklar ist, warum es besser ist in meinem Fall, um die Anzahl der parallelen tasks pro worker-Knoten um 1, und verlassen Sie sich auf meine C++ legacy code multithreading. Ich werde aktualisieren diesen Beitrag mit experiment Ergebnisse, wenn ich am Ende meines Studiums.
- Aus deinem update, was es scheint mir unklar ist, wie Sie zu der Schlussfolgerung gelangt, dass es besser ist, um die Anzahl der parallelen Aufgaben und verlassen Sie sich auf Ihre C++ - multithreading-code.
- Nun, ich bin tatsächlich läuft eine Reihe von spezifischen Experimenten, um zu prüfen, ob es ist mehr interessant darauf zu verlassen, üblichen legacy-multithreading oder verwenden Spark-Ansatz. Ich bin bei google-cloud, und in meinem speziellen Bildverarbeitung Fall der beste Kompromiss : für einen Arbeiter mit N Kernen, N/2 parallele jobs mit Funken, jede Aufgabe mit Multithread auf 2 threads mit openMP. Zum Beispiel : 8 Arbeiter-Knoten mit 16 Kernen, beste Kompromiss 64 parallele jobs, und jeder von Ihnen Multithread auf 2 Kernen. Das Gegenteil (16 parallele jobs, jeder von Ihnen über MT auf 8 Kerne ist zweimal langsamer).
- Vielen Dank für die acclaration.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Dokumentation scheint nicht klar.
Aus meiner Erfahrung, die meisten der gängigen Praxis der Allokation der Ressourcen ist durch die Angabe der Anzahl der Vollzieher und der Anzahl der Kerne pro Nutzer, zum Beispiel (entnommen aus hier):
Dieser Ansatz ist jedoch beschränkt auf GARN, und ist nicht anwendbar auf standalone und sofort basiert Funke, nach diese.
Stattdessen werden die parameter
--total-executor-cores
verwendet werden können, stellt die Summe der Kerne - der Vollstrecker - zugeordnet Funke job. In deinem Fall, mit insgesamt 40 Prozessorkernen, die Einstellung das Attribut--total-executor-cores 40
würde machen Verwendung aller verfügbaren Ressourcen.Leider bin ich nicht bewusst, wie Funke verteilt die Arbeitsbelastung bei weniger Ressourcen als die insgesamt verfügbar sind, zur Verfügung gestellt. Wenn die Arbeit mit zwei oder mehr gleichzeitigen jobs, aber es sollte für den Benutzer transparent sein, dass Funke (oder was auch immer Ressource manager) verwalten würde, wie die Ressourcen verwaltet werden, die je nach Benutzer-Einstellungen.
Sicher zu stellen, wie viele Arbeiter begannen, auf jedem slave, öffnen Sie web-browser, geben Sie http://master-ip:8080, und sehen Sie die
workers
Abschnitt darüber, wie viele Arbeiter hat begonnen wurden, genau, und auch die Arbeiter auf dem slave. (Ich erwähne diese oben, weil ich nicht sicher bin, was meinst du damit, indem Sie sagen: '4 slaves pro Knoten')Standardmäßig Funken beginnen würde, die genau 1 Arbeiter auf jedem slave, es sei denn, Sie geben
SPARK_WORKER_INSTANCES=n
im conf/spark-env.sh, wo n ist die Anzahl der worker-Instanz, die Sie starten möchten auf jeder slave.Wenn Sie uns einen Funken job durch Funken übermitteln, Funke würde eine Anwendung starten, Treiber und mehrere Testamentsvollstrecker für Ihren job.
--total-executor-cores
Sie angegeben haben, beschränken würden, die insgesamt Kerne, die verfügbar ist, um diese Anwendung.