Ich übermittle meinen Code an einen Funke-Standalone-Cluster. Senden Befehl ist wie folgt:
%Vor%Ich spezifiziere den Executor 4G Speicher im obigen Befehl verwenden. Aber benutze den Befehl top, um den Executor-Prozess zu überwachen. Ich merke, dass die Speicherauslastung weiter wächst. Jetzt ist die oberste Befehlsausgabe unten:
%Vor%Mein Gesamtspeicher ist 16G, also sind 37,3% bereits größer als die von mir angegebenen 4GB. Und es wächst immer noch.
Mit dem Befehl ps können Sie feststellen, dass es sich um den Executor-Prozess handelt.
%Vor%Im Folgenden finden Sie den Code. Es ist sehr einfach, also glaube ich nicht, dass es ein Speicherleck gibt.
%Vor%Der Code für die Prozessfunktion ist unten. Bitte beachten Sie, dass ich hier HiveContext nicht SqlContext verwende. Weil SqlContext die Fensterfunktion nicht unterstützt
%Vor%Eigentlich habe ich unten gefunden Code verursacht das Problem:
%Vor%Weil wenn ich diese 5 Zeilen entferne. Der Code kann die ganze Nacht ohne Speichererweiterung laufen. Wenn Sie sie jedoch hinzufügen, erhöht sich die Speicherauslastung von Executor auf eine sehr hohe Zahl.
Grundsätzlich ist der obige Code nur ein Fenster in SparkSQL. Ist das also ein Fehler?
Haftungsausschluss: Diese Antwort basiert nicht auf dem Debugging, sondern auf Beobachtungen und der Dokumentation, die Apache Spark bereitstellt
Ich glaube nicht, dass dies ein Fehler ist!
Wenn wir uns Ihre Konfigurationen ansehen, können Sie sehen, dass Sie sich hauptsächlich auf das Tuning des Executors konzentrieren, was nicht falsch ist, aber Sie vergessen den Teil des Treibers, der die Gleichung enthält.
Einen Blick auf die Spark-Cluster-Übersicht von Apache Spark documentaion
werfenWie Sie sehen, hat jeder Worker einen Executor, in Ihrem Fall ist der Worker-Knoten jedoch derselbe wie der Treiberknoten! Was ehrlich gesagt der Fall ist, wenn Sie lokal oder in einem eigenständigen Cluster in einem einzelnen Knoten arbeiten.
Außerdem nimmt der Treiber standardmäßig 1G Speicher, wenn er nicht mit spark.driver.memory
flag abgestimmt wird. Darüber hinaus sollten Sie nicht die Heap-Nutzung von der JVM selbst und der Web-Oberfläche vergessen, die der Treiber auch mit AFAIK erledigt!
Wenn Sie die von Ihnen erwähnten Codezeilen löschen, bleibt Ihr Code ohne Aktionen , da map
function nur eine Umwandlung ist. Daher wird es keine Ausführung geben. Ich sehe Speichererweiterungen überhaupt!
Gleiches gilt für groupBy
, da es nur eine Umwandlung ist, die nur ausgeführt wird, wenn eine Aktion aufgerufen wird, die in Ihrem Fall agg
und show
weiter unten im Stream ist!
Versuchen Sie, Ihren Treiberspeicher und die Gesamtzahl der Cores in Spark zu minimieren, die durch spark.cores.max
definiert wird, wenn Sie die Anzahl der Cores in diesem Prozess steuern und dann zu den Executoren herunterskalieren möchten. Darüber hinaus würde ich spark.python.profile.dump
zu Ihrer Konfigurationsliste hinzufügen, damit Sie a Profil für die Ausführung Ihres Funke-Jobs, mit dem Sie den Fall besser verstehen und Ihren Cluster besser auf Ihre Bedürfnisse abstimmen können.
Tags und Links memory-leaks memory apache-spark apache-spark-sql