Mein Spark-Treiber verfügt nicht über genügend Arbeitsspeicher nach dem Ausführen für etwa 10 Stunden mit dem Fehler Exception in thread "dispatcher-event-loop-17" java.lang.OutOfMemoryError: GC overhead limit exceeded
. Um weiter zu debuggen, aktivierte ich den G1GC-Modus und auch die GC-Log-Option unter Verwendung von spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties -XX:+PrintFlagsFinal -XX:+PrintReferenceGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1SummarizeConcMark -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
, aber es sieht so aus, als würde es keine Auswirkungen auf den Treiber haben.Apache Spark: Speicherbereinigungsprotokolle für Treiber
Der Job blieb nach 10 Stunden wieder auf dem Treiber hängen und ich sehe keine GC-Protokolle unter stdout auf dem Treiberknoten unter /var/log/hadoop-yar/userlogs/[application-id]/[container-id]/stdout
- also nicht sicher wo sonst zu suchen. Laut Spark GC tuning docs sieht es so aus, als ob diese Einstellungen nur auf Worker-Nodes passieren (was ich in diesem Fall sehen kann, ebenso wie Workers, die GC in stdout einloggt, nachdem ich dieselben Konfigurationen unter spark.executor.extraJavaOptions
verwendet habe). Gibt es überhaupt GC-Protokolle vom Treiber zu aktivieren/zu erwerben? Unter Spark UI -> Environment sehe ich diese Optionen unter spark.driver.extraJavaOptions
aufgelistet, weshalb ich angenommen habe, dass es funktionieren würde.
Umwelt: Der Cluster auf Google Dataproc läuft und ich verwende /usr/bin/spark-submit --master yarn --deploy-mode cluster ...
von der Master-Jobs vorzulegen.
EDIT Einstellung die gleichen Optionen für den Fahrer während des spark-submit
Befehl funktioniert und ich bin in der Lage, die GC-Protokolle auf stdout für den Fahrer zu sehen. Nur das programmatische Festlegen der Optionen über SparkConf scheint aus irgendeinem Grund nicht zu wirken.
Danke für die schnelle Antwort. So wie wir unsere Jobs eingerichtet haben, verwenden wir dasselbe JAR, um mehrere Runs mit unterschiedlichen Eigenschaften zu übermitteln, die Teil der Ressourcen in der JAR selbst sind. Daher hilft die Verwendung von Spark-Submit, da wir das JAR einmal drücken und mehrfach verwenden. Außerdem hatten wir einige zufällige Probleme mit gcloud submit, weshalb wir mit der Verwendung von spark-submit begannen (wir hatten interne Google-Fälle, die nicht viel brauchten). –
Ihr Vorschlag, dass es Teil des Einreichungsflusses ist, erklärt, warum es mit Spark-submit funktioniert - also schätze ich, dass das Problem hier gelöst wird. Danke für die Hilfe –