Mein Cluster: 1 Master, 11 Slaves, jeder Knoten hat 6 GB Speicher.
Meine Einstellungen:
spark.executor.memory=4g, Dspark.akka.frameSize=512
Hier ist das Problem:
Zuerst habe ich einige Daten (2,19 GB) von HDFS zu RDD gelesen:
val imageBundleRDD = sc.newAPIHadoopFile(...)
Zweitens , machen Sie etwas auf diesem RDD:
val res = imageBundleRDD.map(data => {
val desPoints = threeDReconstruction(data._2, bg)
(data._1, desPoints)
})
Zuletzt Ausgabe an HDFS:
res.saveAsNewAPIHadoopFile(...)
Wenn ich mein Programm starte, wird Folgendes angezeigt:
.....
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:24 as TID 33 on executor 9: Salve7.Hadoop (NODE_LOCAL)
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:24 as 30618515 bytes in 210 ms
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:36 as TID 34 on executor 2: Salve11.Hadoop (NODE_LOCAL)
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:36 as 30618515 bytes in 449 ms
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Starting task 1.0:32 as TID 35 on executor 7: Salve4.Hadoop (NODE_LOCAL)
Uncaught error from thread [spark-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[spark]
java.lang.OutOfMemoryError: Java heap space
Es gibt zu viele Aufgaben?
PS : Alles ist in Ordnung, wenn die Eingabedaten ungefähr 225 MB betragen.
Wie kann ich dieses Problem lösen?
out-of-memory
apache-spark
hequn8128
quelle
quelle
Antworten:
Ich habe ein paar Vorschläge:
spark.executor.memory=6g
. Stellen Sie sicher, dass Sie so viel Speicher wie möglich verwenden, indem Sie die Benutzeroberfläche überprüfen (es wird angezeigt, wie viel Mem Sie verwenden).spark.storage.memoryFraction
. Wenn Siecache()
oderpersist
in Ihrem Code nicht verwenden , kann dies genauso gut 0 sein. Der Standardwert ist 0,6, was bedeutet, dass Sie nur 0,4 * 4 g Speicher für Ihren Heap erhalten. Durch die Reduzierung des Mem Frac durch IME verschwinden OOMs häufig. UPDATE: Ab Spark 1.6 müssen wir anscheinend nicht mehr mit diesen Werten spielen, Spark ermittelt sie automatisch.String
und stark verschachtelte Strukturen (wieMap
und verschachtelte Fallklassen). Versuchen Sie nach Möglichkeit, nur primitive Typen zu verwenden und alle nicht-primitiven zu indizieren, insbesondere wenn Sie viele Duplikate erwarten. WählenWrappedArray
Sie nach Möglichkeit verschachtelte Strukturen aus. Oder führen Sie sogar Ihre eigene Serialisierung ein - SIE haben die meisten Informationen darüber, wie Sie Ihre Daten effizient in Bytes sichern können. BENUTZEN SIE ES !Dataset
Ihre Struktur mit a zwischenzuspeichern, da dies eine effizientere Serialisierung ermöglicht. Dies sollte im Vergleich zum vorherigen Aufzählungspunkt als Hack angesehen werden. Wenn Sie Ihr Domain-Wissen in Ihr Algo / Ihre Serialisierung integrieren, können Sie den Speicher- / Cache-Speicherplatz um das 100-fache oder 1000-fache minimieren, wohingegen allesDataset
, was Sie wahrscheinlich geben, 2x - 5x im Speicher und 10x komprimiert (Parkett) auf der Festplatte ist.http://spark.apache.org/docs/1.2.1/configuration.html
BEARBEITEN: (damit ich mich leichter googeln kann) Folgendes weist ebenfalls auf dieses Problem hin:
quelle
spark.executor.memory
da Sie definitiv etwas Speicher für den E / A-Overhead benötigen. Wenn Sie alles verwenden, wird Ihr Programm verlangsamt. Die Ausnahme hiervon könnte Unix sein. In diesem Fall haben Sie Swap Space.Um diesem häufig nicht diskutierten
Spark
Anwendungsfall einen Anwendungsfall hinzuzufügen, werde ich eine Lösung vorschlagen, wenn ich einen Antrag überspark-submit
im lokalen Modus einreiche .Laut dem Gitbook Mastering Apache Spark von Jacek Laskowski :
Wenn also
OOM
Fehler mit dem auftretenheap
, reicht es aus, dasdriver-memory
und nicht das anzupassenexecutor-memory
.Hier ist ein Beispiel:
quelle
Sie sollten die OffHeap-Speichereinstellungen wie folgt konfigurieren:
Geben Sie den Treiberspeicher und den Executor-Speicher gemäß der RAM-Verfügbarkeit Ihres Computers an. Sie können die Größe von offHeap erhöhen, wenn das OutofMemory-Problem weiterhin besteht .
quelle
config
das Problem gelöst.Sie sollten den Treiberspeicher erhöhen. In Ihrem Ordner $ SPARK_HOME / conf sollten Sie die Datei finden
spark-defaults.conf
, bearbeiten und einstellen,spark.driver.memory 4000m
abhängig vom Speicher Ihres Masters, denke ich. Dies hat das Problem für mich behoben und alles läuft reibungslosquelle
Schauen Sie sich die Startskripte an, für die dort eine Java-Heap-Größe festgelegt ist. Es sieht so aus, als würden Sie dies nicht festlegen, bevor Sie den Spark-Worker ausführen.
Die Dokumentation zum Bereitstellen von Skripten finden Sie hier .
quelle
start up scripts
hat sich leider geändert. Vom 19.12.2019Ich habe sehr unter diesem Problem gelitten, wir verwenden die dynamische Ressourcenzuweisung und ich dachte, dass meine Clusterressourcen verwendet werden, um am besten zur Anwendung zu passen.
Die Wahrheit ist jedoch, dass die dynamische Ressourcenzuweisung den Treiberspeicher nicht festlegt und ihn auf seinem Standardwert von 1 g hält.
Ich habe es behoben, indem ich spark.driver.memory auf eine Zahl gesetzt habe, die zum Speicher meines Treibers passt (für 32 GB RAM habe ich es auf 18 GB eingestellt).
Sie können es mit dem Befehl spark submit wie folgt einstellen:
Sehr wichtiger Hinweis: Diese Eigenschaft wird nicht berücksichtigt, wenn Sie sie gemäß der Spark-Dokumentation aus dem Code festlegen:
quelle
Im Allgemeinen kann der Spark Executor JVM-Speicher in zwei Teile unterteilt werden. Funken- und Benutzerspeicher. Dies wird durch die Eigenschaft gesteuert
spark.memory.fraction
- der Wert liegt zwischen 0 und 1. Wenn Sie mit Bildern arbeiten oder eine speicherintensive Verarbeitung in Funkenanwendungen durchführen, sollten Sie den Wert verringernspark.memory.fraction
. Dadurch wird mehr Speicher für Ihre Anwendungsarbeit verfügbar. Spark kann auslaufen, sodass es immer noch mit weniger Speicherfreigabe funktioniert.Der zweite Teil des Problems ist die Arbeitsteilung. Wenn möglich, partitionieren Sie Ihre Daten in kleinere Blöcke. Kleinere Daten benötigen möglicherweise weniger Speicher. Wenn dies jedoch nicht möglich ist, opfern Sie die Berechnung für das Gedächtnis. In der Regel führt ein einzelner Executor mehrere Kerne aus. Der Gesamtspeicher der Ausführenden muss ausreichen, um den Speicherbedarf aller gleichzeitigen Aufgaben zu decken. Wenn das Erhöhen des Executor-Speichers nicht möglich ist, können Sie die Kerne pro Executor verringern, damit jede Aufgabe mehr Arbeitsspeicher erhält. Testen Sie mit 1 Core-Executoren, die über den größtmöglichen Speicher verfügen, den Sie geben können, und erhöhen Sie dann die Anzahl der Kerne, bis Sie die beste Core-Anzahl gefunden haben.
quelle
Haben Sie Ihr Master-GC-Protokoll gelöscht? Also bin ich auf ein ähnliches Problem gestoßen und habe festgestellt, dass SPARK_DRIVER_MEMORY nur den Xmx-Heap gesetzt hat. Die anfängliche Heap-Größe bleibt 1 G und die Heap-Größe wird niemals auf den Xmx-Heap skaliert.
Das Übergeben von "--conf" spark.driver.extraJavaOptions = -Xms20g "behebt mein Problem.
ps aux | grep java und du siehst das folgende log: =
24501 30,7 1,7 41782944 2318184 pts / 0 Sl + 18:49 0:33 / usr / java / latest / bin / java -cp / opt / spark / conf /: / opt / spark / jars / * -Xmx30g -Xms20g
quelle
Der Speicherort für die Größe des Speicherheaps (mindestens in spark-1.0.0) ist conf / spark-env. Die relevanten Variablen sind
SPARK_EXECUTOR_MEMORY
&SPARK_DRIVER_MEMORY
. Weitere Dokumente finden Sie im BereitstellungshandbuchVergessen Sie auch nicht, die Konfigurationsdatei auf alle Slave-Knoten zu kopieren.
quelle
SPARK_EXECUTOR_MEMORY
& eingestellt werden sollSPARK_DRIVER_MEMORY
?SPARK_EXECUTOR_MEMORY
, und welcher Fehler würde Ihnen sagen, dass Sie die erhöhen sollenSPARK_DRIVER_MEMORY
?Ich habe nur wenige Vorschläge für den oben genannten Fehler.
● Überprüfen Sie, ob der als Executor zugewiesene Executor-Speicher möglicherweise mit Partitionen umgehen muss, die mehr Speicher benötigen als zugewiesen.
● Versuchen Sie festzustellen, ob mehr Shuffles aktiv sind, da Shuffles teure Vorgänge sind, da sie Festplatten-E / A, Datenserialisierung und Netzwerk-E / A umfassen
● Verwenden Sie Broadcast-Joins
● Vermeiden Sie die Verwendung von groupByKeys und versuchen Sie, diese durch ReduceByKey zu ersetzen
● Vermeiden Sie die Verwendung großer Java-Objekte überall dort, wo gemischt wird
quelle
Nach meinem Verständnis des oben bereitgestellten Codes wird die Datei geladen, der Kartenvorgang ausgeführt und zurückgespeichert. Es gibt keine Operation, die ein Mischen erfordert. Es gibt auch keine Operation, bei der Daten zum Treiber gebracht werden müssen, sodass das Optimieren von Änderungen im Zusammenhang mit dem Mischen oder dem Treiber möglicherweise keine Auswirkungen hat. Der Treiber hat Probleme, wenn es zu viele Aufgaben gibt, aber dies war nur bis zur Version Spark 2.0.2. Es kann zwei Dinge geben, die schief gehen.
quelle
Durch Festlegen dieser genauen Konfigurationen konnte das Problem behoben werden.
quelle