Wie behebe ich den Fehler „No space left on device“ (Kein Speicherplatz mehr auf dem Gerät) in einem ETL-Auftrag in AWS Glue?

Lesedauer: 6 Minute
0

Ich möchte vermeiden, dass der Fehler „No space left on device“ (Kein Speicherplatz auf dem Gerät übrig) erscheint, wenn ich einen ETL-Auftrag in AWS Glue ausführe.

Kurzbeschreibung

Möglicherweise erhalten Sie die folgenden Arten von Fehlern, wenn Sie einen AWS Glue-Auftrag zum Extrahieren, Transformieren und Laden (ETL) ausführen:

  • Job aborted due to stage failure: Task 68 in stage 158.0 failed 4 times, most recent failure: Lost task 68.3 in stage 158.0 (TID 28820, 10.102.100.111, executor 17): org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.shuffle.sort.ShuffleExternalSorter@55f6dabb: No space left on device (Der Auftrag wurde wegen eines Phasenfehlers abgebrochen: Der Auftrag wurde wegen eines Phasenfehlers abgebrochen: Aufgabe 68.3 in Phase 158.0 verloren (TID 28820, 10.102.100.111, Executor 17): org.apache.spark.Memory.SparkOutOfMemoryError: Fehler beim Aufrufen von spill () auf org.apache.spark.shuffle.sort.shuffleExternalSorter @55f6dabb: Kein Speicherplatz mehr auf dem Gerät)

        -oder-

  • Job aborted due to stage failure: ResultStage 7 has failed the maximum allowable number of times: (Der Auftrag wurde wegen eines Phasenfehlers abgebrochen: ResultStage 7 hat die maximal zulässige Anzahl von Fehlversuchen erreicht:) 4. Most recent failure reason: org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 2 (Letzter Fehlergrund: org.apache.spark.shuffle.MetadataFetchFailedException: Fehlender Ausgabeort für Shuffle 2)

Apache Spark verwendet lokale Festplatten auf AWS Glue-Workern, um Daten aus dem Speicher zu übertragen, die den im Konfigurationsparameter spark.executor.memory definierten Heap-Speicherplatz überschreiten.

Umfassende Transformationen wie groupByKey(), reduceByKey() und join() können ein Shuffle verursachen. Während der Sortier- oder Shufflephase des Jobs schreibt Spark die Zwischendaten auf eine lokale Festplatte, bevor sie zwischen den verschiedenen Workern ausgetauscht werden können. An dieser Stelle erhalten Sie möglicherweise den Fehler „No space left on device“ (Kein Speicherplatz mehr auf dem Gerät) oder einen „MetadataFetchFailedException“-Fehler. Spark löst diesen Fehler aus, wenn auf dem Executor nicht mehr genügend Speicherplatz verfügbar ist und keine Wiederherstellung erfolgt.

Lösung

Diese Art von Fehlern tritt häufig auf, wenn der Verarbeitungsauftrag eine erhebliche Verzerrung des Datensatzes feststellt. In diesem Abschnitt werden einige der häufigsten Überwachungs- und Fehlerbehebungsanomalien aufgeführt und es wird erläutert, wie Sie diese beheben können.

AWS Glue-Autragsmetriken und die Apache Spark-Benutzeroberfläche sind leistungsstarke Tools zur Überwachung von Datenverzerrungen in den Apache Spark-Executoren. Durch die Überwachung des Implementierungszeitraums können Sie mit dem Tool auf einfache Weise alle Probleme identifizieren, die zu Datenverzerrungen führen können. Es hilft Ihnen, das Verhalten der einzelnen Phasen, Aufgaben, Aufträge und Executoren im Detail zu verstehen.

Disaggregieren von Rechenleistung und Speicher

Dieser Ansatz skaliert den Speicher für große Shuffles, anstatt die Daten auf die lokale Festplatte des AWS Glue-Workers zu schreiben.

Verwenden Sie dedizierten serverlosen Speicher: Mit AWS Glue 2.0 oder höher können Sie Amazon Simple Storage Service (Amazon S3) verwenden, um Spark Shuffle- und Überschuss-Daten zu speichern.

AWS Glue 2.0 Verwenden Sie die folgenden Auftragsparameter, um Amazon S3 Shuffle in AWS Glue zu verwenden. Weitere Informationen finden Sie unter AWS Glue Spark Shuffle-Plugin mit Amazon S3.

  • Schlüssel: --write-shuffle-files-to-s3
    Wert: TRUE (wahr)
  • Schlüssel: --write-shuffle-spills-to-s3
    Wert: TRUE (wahr)
  • Schlüssel: --conf
    Wert: spark.shuffle.glue.s3ShuffleBucket=s3://custom_shuffle_bucket
    Hinweis: Das optionale Merkmal spark.shuffle.glue.S3ShuffleBucket gibt den Amazon S3-Bucket an, in den Sie die Shuffle-Dateien schreiben. Ersetzen Sie custom_shuffle_bucket durch den Namen Ihres S3-Buckets.

AWS Glue 3.0/4.0 Verwenden Sie die folgenden Auftragsparameter, um das Cloud Shuffle-Speicher-Plugin für Apache Spark zu verwenden. Weitere Informationen finden Sie unter Cloud Shuffle Speicher-Plugin für Apache Spark.

  • Schlüssel: --write-shuffle-files-to-s3
    Wert: TRUE (wahr)
  • Schlüssel: --conf
    Wert: spark.shuffle.storage.path=s3://custom_shuffle_bucket
    Hinweis: Das optionale Merkmal spark.shuffle.storage.path gibt den Amazon S3-Bucket an, in den Sie die Shuffle-Dateien schreiben. Ersetzen Sie custom_shuffle_bucket durch den Namen Ihres S3-Buckets.

Skalierung

Unter Skalierung versteht man entweder die Erhöhung der Anzahl der Worker durch horizontale Skalierung oder die Aufwertung des Worker-Typs durch vertikale Skalierung. Eine Skalierung funktioniert jedoch möglicherweise nicht immer, insbesondere wenn Ihre Daten bei einigen Schlüsseln stark verzerrt sind. Um Datenverzerrungen zu beheben, sollten Sie erwägen, die Apache Spark-Anwendungslogik zu ändern, indem Sie die Salting-Technik implementieren.

Reduzieren und filtern von Eingabedaten

Filtern Sie die Eingabedaten so weit wie möglich vorab, um Datenverschiebungen und die Netzwerkauslastung bei umfangreichen Operationen zu minimieren. Verwenden Sie die folgenden Techniken für eine effektive Datenfilterung:

Übertragen von kleinen Tabellen

Das Zusammenfügen von Tabellen in Apache Spark kann dazu führen, dass Daten gemischt und riesige Datenmengen zwischen den Executoren verschiedener Worker verschoben werden. Dies kann dazu führen, dass dem System der Arbeitsspeicher ausgeht und die Daten auf die Festplatte des Workers übertragen werden. Um den Netzwerk-Overhead zu minimieren, unterstützt Spark die Verwendung kleinerer Tabellen für die Übertragung. Diese Tabellen sind nicht größer als zehn MB (Megabyte) und verhindern das Partitionieren und Mischen von Daten. Verwenden Sie eine kleinere Tabelle für die Übertragung, indem Sie Spark einen Hinweis geben. Weitere Informationen finden Sie im AWS-Blog Optimieren der Speicherverwaltung in AWS Glue unter Übertragen von kleinen Tabellen.

Verwenden von AQE

Adaptive Query Execution (AQE, Adaptive Abfrageausführung) von Databricks ist eine Optimierungstechnik in Spark SQL. Es verwendet Laufzeitstatistiken, um den effizientesten Plan zur Abfrageimplementierung auszuwählen, um Datenverzerrungen und dynamische Shuffle-Partitionen in jeder Phase zu beheben. AQE ist standardmäßig in AWS Glue 3.0/4.0 verfügbar.

AQE übernimmt die folgenden Funktionen:

  • Dynamische Zusammenlegung von Shuffle-Partitionen
    Fügt Partitionen bei Bedarf nach jeder Abfragephase automatisch zusammen und löst Probleme mit der Partitionsverwaltung. Weitere Informationen finden Sie unter Dynamisches Zusammenführen von Shuffle-Partitionen in Adaptive Abfrageausführung: Beschleunigung von Spark SQL zur Laufzeit auf der Databricks-Website.
    –Zu wenige Partitionen: Teilt automatisch Partitionen mit überschüssigen Daten auf, die zu einer Übertragung auf die lokale Festplatte führen.
    –Zu viele Partitionen: Kombiniert Partitionen automatisch nach Bedarf. Partitionen werden kombiniert, wenn die Datengröße jeder Partition klein ist und kleine Netzwerkdatenabrufe erforderlich sind, um die Shuffle-Blöcke zu lesen.

  • Wechselt dynamisch zwischen Verknüpfungsstrategien
    Konvertiert Sort-Merge in Broadcast Hash Join, basierend auf den Statistiken zur Tabellengröße in jeder Phase.

  • Optimiert dynamisch Schrägverknüpfungen
    Erkennt und optimiert automatisch Schrägverknüpfungen anhand der Statistiken von Shuffle-Dateien. AQE teilt die verzerrten Partitionen in kleinere Unterpartitionen auf. Dann verbindet es diese kleineren Partitionen mit der entsprechenden Partition im anderen Knoten. Weitere Informationen finden Sie unter Dynamisches Optimieren von Schrägverknüpfungen in Adaptive Abfrageausführung: Beschleunigung von Spark SQL zur Laufzeit auf der Databricks-Website.

AQE konfigurieren

Verwenden Sie die folgenden Auftrags-Parameter, um AQE zu aktivieren:

  • Schlüssel: --conf
    Wert: spark.sql.adaptive.enabled=true --conf spark.sql.adaptive.coalescePartitions.enabled=true --conf spark.sql.adaptive.skewJoin.enabled=true
AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr