Warum läuft mein AWS-Glue-ETL-Auftrag so lange?

Letzte Aktualisierung: 20.08.2021

Mein AWS-Glue-Auftrag läuft schon lange.

-oder-

Meine AWS-Glue-Straggler-Aufgabe dauert lange.

Kurzbeschreibung

Einige häufige Gründe, warum Ihre AWS-Glue-Aufträge lange dauern, bis sie abgeschlossen sind, sind die folgenden:

  • Große Datensätze
  • Uneinheitliche Verteilung der Daten in den Datensätzen
  • Ungleichmäßige Verteilung der Aufgaben auf die Ausführer
  • Unzureichende Bereitstellung von Ressourcen

Lösung

Metriken aktivieren

AWS Glue bietet Amazon CloudWatch Metriken, die verwendet werden können, um Informationen über die Ausführer und den Umfang der von jedem Ausführer geleisteten Leistungen bereitzustellen. Sie können CloudWatch-Metriken für Ihren AWS-Glue-Auftrag aktivieren, indem Sie eine der folgenden Aktionen ausführen:

Verwendung eines speziellen Parameters: Fügen Sie Ihrem AWS-Glue-Auftrag das folgende Argument hinzu. Mit diesem Parameter können Sie Metriken für die Auftrags-Profilerstellung für Ihren Auftrags-Lauf sammeln. Diese Metriken sind auf der AWS-Glue-Konsole und der CloudWatch-Konsole verfügbar.

Key: --enable-metrics

Verwendung der AWS-Glue-Konsole: Gehen Sie wie folgt vor, um Metriken für einen vorhandenen Auftrag zu aktivieren:

  1. Öffnen Sie die AWS-Glue-Konsole.
  2. Wählen Sie im Navigationsbereich Aufträge aus.
  3. Wählen Sie den Job aus, für den Sie Metriken aktivieren möchten.
  4. Wählen Sie Aktion und dann Auftrag bearbeitenaus.
  5. Wählen Sie unter Überwachungsoptionen, Auftrags-Metrikenaus.
  6. Wählen Sie Speichern aus.

Verwendung der API: Verwenden Sie die AWS-Glue UpdateJob-API mit - -aktivieren-Metriken als DefaultArguments-Parameter, um Metriken für einen vorhandenen Auftrag zu aktivieren.

Hinweis: AWS-Glue 2.0 verwendet kein YARN, das Metriken meldet. Dies bedeutet, dass Sie einige der Ausführer-Metriken, wie NumberMaxNeedeExecutors und numberAlleExecutor, für AWS Glue 2.0 nicht abrufen können.

Fortlaufende Protokollierung aktivieren

Wenn Sie die kontinuierliche Protokollierung in Ihrem AWS-Glue-Job aktivieren, werden die Echtzeittreiber- und Ausführer-Protokolle alle fünf Sekunden an CloudWatch übertragen. Mit diesen Protokollierungsinformationen in Echtzeit erhalten Sie weitere Details zum laufenden Auftrag. Weitere Informationen finden Sie unter Kontinuierliche Protokollierung für AWS-Glue-Aufträge aktivieren.

Überprüfen Sie die Treiber- und Ausführer-Protokolle

Suchen Sie in den Treiberprotokollen nach Aufgaben, die lange ausgeführt wurden, bevor sie abgeschlossen wurden. Beispiel:

2021-04-15 10:53:54,484 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 10:53:54,484 INFO [task-result-getter-1] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 0.0 in stage 7.0 (TID 139) in 4538 ms on 10.117.101.76 (executor 10) (13/14)
...
2021-04-15 12:11:30,692 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 12:11:30,692 INFO [task-result-getter-3] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 13.0 in stage 7.0 (TID 152) in 4660742 ms on 10.117.97.97 (executor 11) (14/14)

In diesen Protokollen können Sie sehen, dass die Ausführung einer einzelnen Aufgabe 77 Minuten dauerte. Verwenden Sie diese Informationen, um zu überprüfen, warum diese bestimmte Aufgabe lange dauert. Sie können dies mithilfe der Apache-Spark-Benutzeroberfläche tun. Die Spark-Benutzeroberfläche bietet gut strukturierte Informationen für verschiedene Phasen, Aufgaben und Ausführer.

Aktivieren der Spark-Benutzeroberfläche

Sie können die Spark-Benutzeroberfläche verwenden, um Probleme mit Spark-Aufträgen zu beheben, die für eine lange Zeit ausgeführt werden. Durch das Starten des Spark-Verlaufsservers und das Aktivieren der Spark-Benutzeroberflächen-Protokolle können Sie Informationen zu den Phasen und Aufgaben abrufen. Mithilfe der Protokolle können Sie erfahren, wie die Aufgaben von den Mitarbeitern ausgeführt werden. Sie können die Spark-Benutzeroberfläche mithilfe der AWS-Glue-Konsole oder der AWS Command Line Interface (AWS CLI) aktivieren. Weitere Informationen finden Sie unter Aktivierung der Apache-Spark-Web-Benutzeroberfläche für AWS-Glue-Aufträge.

Nachdem der Auftrag abgeschlossen ist, werden möglicherweise Treiberprotokolle ähnlich den folgenden angezeigt:

ERROR executionlogs:128 - example-task-id:example-timeframe INFO [pool-2-thread-1] s3n.MultipartUploadOutputStream (MultipartUploadOutputStream.java:close(414)): close closed:false s3://dox-example-bucket/spark-application-1626828545941.inprogress

Nachdem Sie die Protokolle für den Auftrag analysiert haben, können Sie den Spark-Verlaufsserver entweder auf einer Amazon Elastic Compute Cloud (Amazon EC2) -Instance oder mithilfe von Docker starten. Öffnen Sie die Benutzeroberfläche und navigieren Sie zur Registerkarte Ausführer, um zu überprüfen, ob ein bestimmter Ausführer länger läuft. In diesem Fall könnte die ungleichmäßige Verteilung der Arbeit und die Unterauslastung der verfügbaren Ressourcen aufgrund einer Datenverzerrung im Datensatz verursacht werden. Auf der Registerkarte Etappen erhalten Sie weitere Informationen und Statistiken zu den Phasen, die lange gedauert haben. Sie finden Details darüber, ob diese Phasen teure und zeitaufwändige Shuffle-Störfälle beinhalteten.

Kapazitätsplanung für Datenverarbeitungseinheiten (DPUs)

Wenn alle Ausführer gleichermaßen für den Auftrag beitragen, die Beendigung der Arbeit jedoch noch lange dauert, sollten Sie in Betracht ziehen, mehr Worker zu Ihrem Job hinzuzufügen, um die Geschwindigkeit zu verbessern. Die DPU-Kapazitätsplanung kann Ihnen helfen, Folgendes zu vermeiden:

  • Eine Unterbereitstellung, die dazu führen kann, ist eine langsamere Ausführungszeit.
  • Überbereitstellung, die höhere Kosten verursacht, aber im gleichen Zeitraum Ergebnisse liefert.

Aus CloudWatch-Metriken können Sie Informationen über die Anzahl der derzeit verwendeten Ausführer und die maximale Anzahl der benötigten Ausführer abrufen. Die Anzahl der benötigten DPUs hängt von der Anzahl der Eingabepartitionen und dem angeforderten Workertyp ab.

Beachten Sie Folgendes, wenn Sie die Anzahl der Eingabepartitionen definieren:

  • Wenn die Dateien des Amazon Simple Storage Service (Amazon S3) nicht aufteilbar sind, entspricht die Anzahl der Partitionen der Anzahl der Eingabedateien.
  • Wenn die Amazon-S3-Dateien teilbar sind und die Daten unstrukturiert/halbstrukturiert sind, entspricht die Anzahl der Partitionen der Gesamtdateigröße/64 MB. Wenn die Größe jeder Datei weniger als 64 MB beträgt, entspricht die Anzahl der Partitionen der Anzahl der Dateien.
  • Wenn die Amazon-S3-Dateien teilbar sind und die Daten strukturiert sind, entspricht die Anzahl der Partitionen der Gesamtdateigröße/128 MB.

Gehen Sie wie folgt vor, um die optimale Anzahl von DPUs zu berechnen:

Angenommen, die Anzahl der Eingabepartitionen beträgt 428. Dann können Sie die optimale Anzahl von DPUs mit der folgenden Formel berechnen:

Maximale Anzahl benötigter Ausführer = Anzahl der Eingabepartitionen/Anzahl der Aufgaben pro Ausführer = 428/4 = 107

Beachten Sie Folgendes:

  • Der Standardworkertyp unterstützt 4 Aufgaben pro Ausführer.
  • G.1X unterstützt 8 Aufgaben pro Ausführer.
  • G.2X unterstützt 16 Aufgaben pro Ausführer.

Der Standardworkertyp hat zwei Ausführer, einschließlich eines Treibers, in einem Knoten. Einer dieser Ausführer ist ein Treiber in Spark. Daher benötigen Sie 108 Ausführer.

Die Anzahl der benötigten DPUs = (Anzahl der Ausführer/Anzahl der Ausführer pro Knoten) + 1 DPU = (108/2) + 1 = 55.