1

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.

Antwort

2

Ich glaube, spark.driver.extraJavaOptions wird von SparkSubmit.scala behandelt und muss bei Aufruf übergeben werden. Um dies mit Dataproc zu tun, können Sie das zu the properties field (--properties in gcloud dataproc jobs submit spark) hinzufügen.

Außerdem können Sie anstelle von -Dlog4j.configuration=log4j.propertiesthis guide verwenden, um detaillierte Protokollierung zu konfigurieren.

kann ich GC-Treiber Logs mit: gcloud dataproc jobs submit spark --cluster CLUSTER_NAME --class org.apache.spark.examples.SparkPi --jars file:///usr/lib/spark/examples/jars/spark-examples.jar --driver-log-levels ROOT=DEBUG --properties=spark.driver.extraJavaOptions="-XX:+PrintFlagsFinal -XX:+PrintReferenceGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1SummarizeConcMark -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp" --

Sie nicht --driver-log-levels ROOT=DEBUG wahrscheinlich brauchen, aber in Ihrer Logging-Konfiguration von log4j.properties kopieren. Wenn Sie wirklich log4j.properties verwenden möchten, können Sie wahrscheinlich verwenden --files log4j.properties

+0

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). –

+0

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 –