Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Warum schlägt mein AWS Glue-Job mit verlorenen Knoten fehl, wenn ich einen großen Datensatz von Amazon RDS zu Amazon S3 migriere?
Ich verwende AWS Glue, um einen großen Datensatz von Amazon Relational Database Service (Amazon RDS) oder einer lokalen JDBC-Datenbank zu Amazon Simple Storage Service (Amazon S3) zu migrieren. 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 du eine große JDBC-Tabelle migrierst, dann 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, lies die JDBC-Tabelle parallel. Wenn der Job immer noch fehlschlägt und Knoten verloren gehen, dann verwende einen SQL-Ausdruck als Pushdown-Prädikat.
Lösung
Um Fehler beim Verlust von Knoten für JDBC-Datensätze zu beheben, verwende eine oder mehrere der folgenden Methoden.
Die JDBC-Tabelle parallel lesen
Wenn die Tabelle keine numerischen Spalten hat, wie z. B. (INT oder BIGINT), dann verwende die hashfield-Option, um die Daten zu partitionieren. Setzt hashfieldauf den Namen einer Spalte in der JDBC-Tabelle. Die besten Ergebnisse erzielst du, wenn du eine Spalte mit einer gleichmäßigen Verteilung der Werte wählst.
Wenn die Tabelle numerische Spalten hat, lege dann die hashpartitions- und hashexpression-Optionen in der Tabelle fest oder während du DynamicFrame erstellst. Weitere Informationen findest du unter Paralleles Lesen aus JDBC-Tabellen.
Das Folgende ist ein Beispiel dafür, wie hashpartitions und hashexpression gesetzt werden, während du ein DynamicFrame mit einer JDBC-Verbindung erstellst. Ersetze 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")
Hinweis: Ersetze die JDBC-URL, your_user_name, your_password, your_table und column_name durch deine Informationen.
Im Folgenden findest du ein Beispiel dafür, wie hashpartitions und hashexpression festgelegt werden, wenn du einen DynamicFrame aus dem AWS Glue-Datenkatalog erstellst:
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: Wenn du größere Werte für hashpartitions festlegst, kannst du die Leistung der Tabelle reduzieren. Das liegt daran, dass jede Aufgabe die gesamte Tabelle liest und dann eine Reihe von Zeilen an den Executor zurückgibt.
Einen SQL-Ausdruck als Pushdown-Prädikat verwenden
Hinweis: Der folgende SQL-Ausdruck funktioniert nicht als Pushdown-Prädikat für Oracle-Datenbanken. Dieser Ausdruck funktioniert als Pushdown-Prädikat für alle anderen Datenbanken, die AWS Glue nativ unterstützt. Zu diesen Datenbanken gehören Amazon Aurora, MariaDB, Microsoft SQL Server, MySQL und PostgreSQL.
Wenn die Tabelle Milliarden von Datensätzen und Tebibytes (TiB) an Daten enthält, kann es lange dauern, bis der Job abgeschlossen ist oder er schlägt mit verlorenen Knoten fehl. Diese Verzögerung oder dieser Fehler kann auch nach dem Festlegen von hashpartitions und hashexpression auftreten. Um diese Probleme zu lösen, verwende einen SQL-Ausdruck, der dem folgenden ähnelt, mit der Option hashexpression:
column_name > 1000 AND column_name < 2000 AND column_name
Verwende einen SQL-Ausdruck als Pushdown-Prädikat. Der Ausdruck 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: Deaktiviere Job-Lesezeichen für die ersten Auftragsausführungen mit dieser Konfiguration. Wenn du einen Job mit einem Job-Lesezeichen ausführst, zeichnet AWS Glue den Maximalwert der Spalte auf. Wenn du den Job erneut ausführst, verarbeitet AWS Glue nur die Zeilen, deren Werte größer sind als der vorherige Lesezeichenwert. Aktiviere nach Bedarf die Job-Lesezeichen während der letzten Auftragsausführung.
Ähnliche Informationen
