Warum schlägt mein AWS Glue-Job mit verlorenen Knoten fehl, wenn ich einen großen Datensatz von Amazon RDS zu Amazon S3 migriere?

Lesedauer: 4 Minute
0

Ich migriere einen großen Datensatz von Amazon Relational Database Service (Amazon RDS) oder einer lokalen JDBC-Datenbank zu Amazon Simple Storage Service (Amazon S3) mit AWS Glue. Mein ETL-Job läuft lange und schlägt dann mit verlorenen Knoten fehl.

Kurzbeschreibung

AWS Glue verwendet eine einzige Verbindung, um den gesamten Datensatz zu lesen. Wenn Sie eine große JDBC-Tabelle migrieren, kann der ETL-Auftrag lange Zeit laufen, ohne dass auf der AWS Glue-Seite ein Fortschritt zu erkennen ist. In diesem Fall könnte der Auftrag aufgrund von Problemen mit dem Speicherplatz (verlorene Knoten) fehlschlagen. Um dieses Problem zu beheben, lesen Sie die JDBC-Tabelle parallel. Wenn der Job immer noch fehlschlägt und Knoten verloren gehen, verwenden Sie einen SQL-Ausdruck als Pushdown-Prädikat.

Behebung

Verwenden Sie eine oder mehrere der folgenden Methoden, um Fehler beim Verlust von Knoten für JDBC-Datensätze zu beheben.

Lesen Sie die JDBC-Tabelle parallel

Wenn die Tabelle keine numerischen Spalten hat (INT oder BIGINT), verwenden Sie die **** hashfield-Option, um die Daten zu partitionieren. Setzt hashfieldauf den Namen einer Spalte in der JDBC-Tabelle. Die besten Ergebnisse erzielen Sie, wenn Sie eine Spalte mit einer gleichmäßigen Verteilung der Werte wählen.

Wenn die Tabelle numerische Spalten hat, legen Sie die hashpartitions- und ****hashexpression-Optionen in der Tabelle oder beim Erstellen des DynamicFrame fest:

  • hashpartitions: definiert die Anzahl der Aufgaben, die AWS Glue zum Lesen der Daten erstellt
  • hashexpression: teilt Zeilen gleichmäßig auf die Aufgaben auf

Das Folgende ist ein Beispiel dafür, wie hashpartitions und hashexpression gesetzt werden, während ein DynamicFrame mit einer JDBC-Verbindung erstellt wird. Ersetzen Sie in der connection_optiondie JDBC-URL, den Benutzernamen, das Passwort, den Tabellennamen und den Spaltennamen.

connection_option= {"url": "jdbc:mysql://mysql–instance1.123456789012.us-east-1.rds.amazonaws.com:3306/database", "user": "your_user_name", "password": "your_password","dbtable": "your_table","hashexpression":"column_name","hashpartitions":"10"}

datasource0 = glueContext.create_dynamic_frame.from_options('mysql',connection_options=connection_option,transformation_ctx = "datasource0")

Hier ist ein Beispiel für das Festlegen von hashpartitions und hashexpression beim Erstellen eines DynamicFrames aus dem AWS Glue-Katalog:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "your_database", table_name = "your_table",additional_options={"hashexpression":"column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

Hinweis: Das Festlegen größerer Werte für hashpartitions kann die Leistung Ihrer Tabelle verringern. Das liegt daran, dass jede Aufgabe die gesamte Tabelle liest und dann eine Reihe von Zeilen an den Executor zurückgibt.

Weitere Informationen finden Sie unter Paralleles Lesen aus JDBC-Tabellen.

Verwenden Sie einen SQL-Ausdruck als Pushdown-Prädikat

Hinweis: Der folgende SQL-Ausdruck funktioniert nicht als Pushdown-Prädikat für Oracle-Datenbanken. Dieser Ausdruck funktioniert jedoch als Pushdown-Prädikat für alle anderen Datenbanken, die von AWS Glue nativ unterstützt werden (Amazon Aurora, MariaDB, Microsoft SQL Server, MySQL und PostgreSQL).

Wenn die Tabelle Milliarden von Datensätzen und Tebibyte (TiB) an Daten enthält, kann es lange dauern, bis der Job abgeschlossen ist, oder er schlägt mit verlorenen Knoten fehl, selbst nachdem Sie hashpartitions und hashexpression eingerichtet haben. Um diese Probleme zu lösen, verwenden Sie einen SQL-Ausdruck, der dem folgenden ähnelt, mit der **Option **hashexpression:

column_name > 1000 AND column_name < 2000 AND column_name

Der SQL-Ausdruck fungiert als Pushdown-Prädikat und zwingt den Job, einen Satz von Zeilen pro Auftragsausführung zu lesen, anstatt alle Daten auf einmal zu lesen. Die vollständige Aussage sieht in etwa wie folgt aus:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "sampledb", table_name = "test_table",additional_options={"hashexpression":"column_name > 1000 AND column_name < 2000 AND column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")

Hinweis: Stellen Sie sicher, dass Sie Job-Lesezeichen für die ersten Auftragsausführungen mit dieser Konfiguration deaktivieren. Wenn Sie einen Job mit einem Job-Lesezeichen ausführen, zeichnet AWS Glue den Maximalwert der Spalte auf. Wenn Sie den Job erneut ausführen, verarbeitet AWS Glue nur die Zeilen, deren Werte größer sind als der vorherige Lesezeichenwert. Sie können die Job-Lesezeichen während der letzten Auftragsausführung nach Bedarf aktivieren.


Ähnliche Informationen

Warum schlägt mein AWS Glue-Job mit dieser Fehlermeldung fehl: „Exit Status: -100. Diagnosen: Container auf einem *lost* Knoten veröffentlicht“?

Verbindungen im AWS Glue-Datenkatalog definieren

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren