Ressourcenzuweisung für Spark-Jobs auf Mesos verstehen

Ich arbeite an einem Projekt in Spark und bin kürzlich von Spark Standalone auf Mesos für die Clusterverwaltung umgestiegen. Ich bin jetzt verwirrt darüber, wie ich Ressourcen zuweisen soll, wenn ich einen Job unter dem neuen System abschicke.

Im Standalone-Modus habe ich so etwas verwendet (nach einigen Empfehlungen vondieser Cloudera-Blogeintrag:

/opt/spark/bin/spark-submit --executor-memory 16G --executor-cores 8 
    --total-executor-cores 240 myscript.py

Dies ist ein Cluster, in dem jeder Computer über 16 Kerne und ~ 32 GB RAM verfügt.

Was war schön daran, dass ich die Anzahl der ausgeführten Executoren und die ihnen zugewiesenen Ressourcen genau kontrollieren konnte. Im obigen Beispiel wusste ich, dass ich 240/8 = 30 Executoren mit jeweils 16 GB Arbeitsspeicher und 8 Kernen habe. Angesichts des Arbeitsspeichers auf jedem Computer im Cluster würde dies nicht mehr als zwei Ausführer bedeuten, die auf jedem Computer ausgeführt werden. Wenn ich mehr Testamentsvollstrecker haben wollte, könnte ich so etwas tun wie

/opt/spark/bin/spark-submit --executor-memory 10G --executor-cores 5 
    --total-executor-cores 240 myscript.py

Dies würde mir jetzt 240/5 = 47 Executoren mit jeweils 5 Kernen und 10 GB Speicher geben und würde bis zu 3 Executoren pro Maschine erlauben.

Aber jetzt, wo ich auf Mesos bin, werde ich ein bisschen verwirrt. Zuallererst werde ich im grobkörnigen Modus ausgeführt, um sicherzustellen, dass ich meine Ressourcenzuweisung korrigieren und steuern kann (dies steht im Dienst eines recht komplexen Modells, in dem wir Ressourcen vorab zuweisen möchten).

Nun kann ich @ angeb--total-executor-cores und--executor-memory, aber die Dokumentation sagt mir, dass--exeuctor-cores gilt nur für Spark Standalone und YARN, wodurch es schwierig wird, die Gesamtzahl der Executoren und Ressourcen anzugeben, die jedem einzelnen zugeordnet sind. Angenommen, ich führe Folgendes aus:

/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py

Wenn ich diesen Job in der Mesos-Web-Benutzeroberfläche untersuche, wird es langsam unübersichtlich. Also, hier sind meine Fragen:

Terminologie. Die Web-Benutzeroberfläche listet "Frameworks" auf, von denen ich annehme, dass sie "Jobs" in der eigenständigen Benutzeroberfläche entsprechen. Wenn ich jedoch auf das Detail für ein bestimmtes Framework klicke, werden "Aufgaben" aufgelistet. Aber das können doch keine eigentlichen Spark-Aufgaben sein, oder? Soweit ich das beurteilen kann, muss "Aufgabe" für Spark tatsächlich "Vollstrecker" sein. Dies würde mit der Benutzeroberfläche übereinstimmen, die besagt, dass mein Framework (Job) 15 aktive Tasks, 240 CPUs und 264 GB Arbeitsspeicher hat.

264/15 = 17.6, was mit dem 16-GB-Speicher pro Executor, den ich angegeben habe, in Einklang zu stehen scheint (plus etwas Overhead, denke ich). Bin ich richtig, wie ich das alles interpretiere?

Angenommen ja, wenn ich eine dieser "Aufgaben" (Executoren) untersuche, sehe ich, dass jeder 16 Kerne zugewiesen hat. Angesichts der Tatsache, dass wir 16 Kerne pro Computer haben, scheint dies darauf hinzudeuten, dass auf jedem der 16 Computer im Grunde ein Executor ausgeführt wird und jeder Executor die vollen 16 Kerne erhält, aber nur 16 GB RAM. (Beachten Sie, dass, auch wenn ich @ fall--executor-memory weit unten, auf so etwas wie 4 GB, läuft bei Mesos immer noch nur ein Executor pro Knoten (mit 16 Kernen und 4 GB RAM). Aber was ich erreichen möchte, ist so etwas wie meine ersten beiden Beispiele. Das heißt, ich möchte mehrere Executoren pro Knoten ausführen, die sich jeweils den RAM und die Kerne dieses Knotens teilen (d. H. Eine moderate Anzahl von Kernen vor dem Executor, 5-8). In Anbetracht dessen, dass ich @ nicht angeben ka--executor-cores in Mesos, wie mache ich das? Oder bin ich aus irgendeinem Grund weit von der Basis entfernt, um dies überhaupt zu erreichen? Erlaubt Mesos einfach nicht mehrere Exeuktoren pro Knoten?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage