Wie behebe ich den Fehler „java.lang.OutOfMemoryError: Java heap space“ in einem AWS Glue-Spark-Job?

Lesedauer: 4 Minute
0

Mein AWS Glue-Job schlägt mit „Befehl mit Exit-Code 1 fehlgeschlagen“ fehl. In den Amazon CloudWatch Logs wird der Fehler „java.lang.OutOfMemoryError: Java heap space“ angezeigt.

Kurze Beschreibung

Der Fehler „java.lang.OutOfMemoryError: Java heap space“ weist darauf hin, dass einem Treiber oder Executor nicht mehr genügend JVM-Speicher zur Verfügung steht. Informationen zur Feststellung, ob ein Treiber oder ein Executor das OOM verursacht, finden Sie unter Debuggen von OOM-Ausnahmen und Job-Anomalien.

Hinweis: Die folgende Lösung gilt nur für OOM-Ausnahmen von Treibern.

Treiber-OOM-Ausnahmen werden durch Folgendes verursacht:

  • Der AWS Glue-Spark-Job liest eine große Anzahl kleiner Dateien aus Amazon Simple Storage Service (Amazon S3)
  • Treiberintensive Vorgänge wie „collect()“, „Broadcast Joins“ und „Shared Variable“

Lösung

Behebung von Treiber-OOM-Ausnahmen, die durch eine große Anzahl kleiner Dateien verursacht wurden

Verwenden Sie eine oder mehrere der folgenden Methoden, um Treiber-OOM-Ausnahmen zu beheben, die durch eine große Anzahl kleiner Dateien mit DynamicFrames verursacht werden.

Aktivieren von useS3ListImplementation

Beim Auflisten von Dateien erstellt AWS Glue einen Dateiindex in den Treiberspeicherlisten. Wenn Sie useS3ListImplementation auf True setzen, speichert AWS Glue die Liste der Dateien im Speicher nicht auf einmal. Stattdessen speichert AWS Glue die Liste stapelweise im Cache. Das bedeutet, dass es unwahrscheinlicher ist, dass dem Treiber der Arbeitsspeicher ausgeht.

Sehen Sie sich das folgende Beispiel an, wie Sie useS3ListImplementation mit from_catalog aktivieren:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")

Sehen Sie sich das folgende Beispiel an, das useS3ListImplementation mit from_options aktiviert:

datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")

Die Funktion useS3ListImplementation ist eine Implementierung des Amazon S3 ListKeys-Vorgangs. Dadurch werden große Ergebnismengen in mehrere Antworten aufgeteilt. Es ist eine bewährte Vorgehensweise, useS3ListImplementation mit Job-Lesezeichen zu verwenden.

Gruppierung

Eine Spark-Anwendung verarbeitet jede kleine Datei mit einer anderen Spark-Aufgabe. Dies kann zu OOM führen, da der Treiber die Standort- und Aufgabeninformationen speichert und verfolgt. Wenn Sie die Gruppierungsfunktion aktivieren, verarbeiten Aufgaben eine Gruppe mehrerer Dateien statt einzelner Dateien. Die Gruppierung wird automatisch aktiviert, wenn Sie dynamische Frames verwenden und wenn der Amazon S3-Datensatz mehr als 50.000 Dateien enthält. Weitere Informationen finden Sie unter Lesen von Eingabedateien in größeren Gruppen.

Filtern mit Push-Down-Prädikaten

Reduzieren Sie die Anzahl der Amazon S3-Dateien und Amazon S3-Partitionen, die der AWS Glue-Job liest, indem Sie Push-Down-Prädikate verwenden. Dadurch werden die nicht benötigten Partitionen aus der AWS Glue-Tabelle entfernt, bevor die zugrunde liegenden Daten gelesen werden. Weitere Informationen finden Sie unter Vorfiltern mithilfe von Push-Down-Prädikaten.

Treiber-OOM-Ausnahmen, die durch treiberintensive Vorgänge verursacht werden

Beheben Sie Treiber-OOM-Ausnahmen, die durch treiberintensive Vorgänge verursacht werden, mithilfe einer der folgenden Methoden.

Achten auf treiberintensive Vorgänge

collect() ist ein Spark-Vorgang, der die Ergebnisse von Workern sammelt und sie dann als einzelnes Objekt an den Treiber zurückgibt. Die Ergebnisse können sehr umfangreich sein und den Treiber überlasten. Die Spark-Konfiguration spark.driver.maxResultSize ist standardmäßig auf 1 GB festgelegt und trägt dazu bei, den Treiber vor Überlastung zu schützen.

Beschränken Sie diese Aktionen also und verwenden Sie stattdessen nach Möglichkeit Aktionen wie take(), takeSample() oder isEmpty().

Beachten Sie auch, dass Broadcast-Joins in Spark OOM-Fehler verursachen können, wenn die Relation (Tabelle) größer ist als der verfügbare Speicher des Treibers. Bevor eine Relation an die Executors übertragen wird, wird sie am Treiber-Knoten materialisiert. Wenn mehrere Tabellen übertragen werden oder die Relation zu groß ist, kann es beim Treiber zu einem Speichermangel kommen. Verwenden Sie die Spark-Konfiguration spark.sql.autoBroadcastJoinThreshold und Spark Join Hints, um dies zu steuern.

Regelmäßiges Löschen gemeinsam genutzter Variablen

Achten Sie darauf, gemeinsam genutzte Variablen sorgfältig verwenden. Löschen Sie gemeinsam genutzte Variablen, wenn Sie sie nicht mehr benötigen, da sie zu OOM-Ausnahmen von Spark-Treibern führen können. Es gibt zwei Arten von gemeinsam genutzten Variablen, Broadcast-Variablen und Akkumulatoren.

  • Broadcast-Variablen sind schreibgeschützte Daten, die nur einmal an Executors gesendet werden. Sie sind eine gute Lösung, um unveränderliche Referenzdaten wie ein kleines Wörterbuch oder kleine Tabellen zu speichern, die von allen Executors gemeinsam genutzt werden.
  • Akkumulatoren stellen eine beschreibbare Kopie aller Spark-Executors bereit und können verwendet werden, um verteilte Zähler (wie in MapReduce) oder Summen zu implementieren.

Zusätzliche Problembehebung

  • Analysieren Sie Ihren Datensatz und wählen Sie den richtigen Worker-Typ für Ihren Job aus. Erwägen Sie eine Skalierung auf G.1X oder G.2X.
  • Verwenden Sie CloudWatch-Protokolle und CloudWatch-Metriken, um den Treiberspeicher zu analysieren. Richten Sie CloudWatch-Alarme ein, die Sie benachrichtigen, wenn in Ihrem Job bestimmte Schwellenwerte überschritten werden.
  • Schalten Sie die Spark-Benutzeroberfläche für Ihren AWS Glue-Job ein und sehen Sie sich die Spark Event-Protokolle an, um zu verstehen, warum das OOM stattfindet. Weitere Informationen finden Sie unter Überwachen von Jobs mithilfe der Apache Spark-Web-Benutzeroberfläche.

Ähnliche Informationen

Optimieren der Speicherverwaltung in AWS Glue

Lesen von Eingabedateien in größeren Gruppen

Bewährte Methoden für die erfolgreiche Speicherverwaltung für Apache Spark-Anwendungen auf Amazon EMR

Überwachen von Jobs mithilfe der Apache Spark-Web-Benutzeroberfläche

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren