2016-06-09 14 views
2

Ich frage mich, wie das Verhalten von Spark im feinkörnigen Modus auf Mesos sein würde, wenn Cgroups aktiviert sind.Verhalten von Mesos bei Verwendung von Steuergruppen für Spark

Eine Sorge ist, wenn ich Mesos + Funken ohne cgroups verwende, zeigt es bereits, dass der tatsächliche Spark Executor-Prozess mindestens 10% mehr Speicher verwendet, als was es Mesos versprochen hat, es zu verwenden. Würden Sie die Spark-Executoren bei der Aktivierung von cgroups ausschalten?

Zweitens, wie wird Datei-Cache behandelt? Spark stützt sich stark auf den Dateicache. Wird der Datei-Cache auf die Speichermenge in Mesos angerechnet? Wahrscheinlich nicht, aber könnten wir das beeinflussen? Zum Beispiel möchte ich im Idealfall, dass Spark insgesamt 8 GB verwendet, von denen 5 GB für den Java-Prozess verwendet werden sollten - vorausgesetzt, dass Spark gut spielt und nicht über 5 GB hinauswächst - und 3 GB als File-Cache (max).

Ich hoffe, dass jemand Erfahrung damit hat, denn um diese Dinge selbst zu testen, müsste ich viele Supportanfragen von unserem Cluster sysadmin durchlaufen, da cgroups sich zu einem Zeitpunkt auf Root-Anmeldeinformationen verlassen würde - und ich würde hasse es, umsonst zu sein, ohne andere gefragt zu haben.

Antwort

0

Um Ihre erste Frage zu beantworten, scheint es, dass Sie etwas mit der Funktionsweise von Cgroups verwechselt haben. Der Executor würde einfach nicht (und tatsächlich, wie ich bestätigen kann) in der Lage sein, mehr Speicher zuzuweisen, als die Cgroups erlauben würden. Also würde Mesos nicht wirklich als Prozess-Killer oder so handeln *. Aber einige Arten von Programmen würden in der Tat brechen, wenn es nicht möglich ist, mehr Speicher zuzuordnen, und es hängt von dem Programm ab, ob es dann beendet wird oder in der Lage ist, gut zu laufen, aber vielleicht mit weniger Speicher und/oder Leistung.

Für Ihre zweite Frage scheint es keine Konfigurationseinstellungen zu geben, um die tatsächliche Cgroup-Speichermenge zu beeinflussen. Es scheint eine Eins-zu-eins-Zuordnung zwischen der Executor-Speichereinstellung und dem, was Spark von Mesos erhält. Ich denke jedoch, dass es einen versteckten Faktor gibt, da ich sehen kann, dass Spark ungefähr 5,8 GB verlangt, aber ich habe den Executor-Speicher tatsächlich auf 5 GB gesetzt. (Ich werde das Ticket aktualisieren, sobald ich diesen versteckten Faktor von wahrscheinlich 15% im Quellcode finden kann.)

Update, die Einstellung, die Sie möchten, ist spark.mesos.executor.memoryOverhead. Sie können eine Zahl in MegaBytes angeben, die dem Executor-Speicher als Gesamtspeicher hinzugefügt wird, der als Mesos-Ressource und somit als Cgroup-Speicherbegrenzung verwendet wird.

* = Update2, tatsächlich cgroups standardmäßig Kill-Prozesse, die über das Limit der Kontrollgruppe wachsen. Ich kann bestätigen, dass die memory.oom_control in /cgroups/memory/x/ auf '0' gesetzt ist (was counter-intuitiv aktiviert ist). Im Fall von Spark ist es jedoch der oben erwähnte 10-15% Overhead, der genügend Spielraum gibt, um nicht auf OOM zu stoßen.

Verwandte Themen