Perché il mio processo AWS Glue ha esito negativo con perdita di nodi quando eseguo la migrazione di un set di dati di grandi dimensioni da Amazon RDS ad Amazon S3?
Sto utilizzando AWS Glue per eseguire la migrazione di un set di dati di grandi dimensioni da Amazon Relational Database Service (Amazon RDS) o un database JDBC on-premises ad Amazon Simple Storage Service (Amazon S3). Il processo ETL resta a lungo in esecuzione, quindi ha esito negativo con perdita di nodi.
Breve descrizione
AWS Glue utilizza un'unica connessione per leggere l'intero set di dati. Se esegui la migrazione di una tabella JDBC di grandi dimensioni, il processo ETL potrebbe essere eseguito a lungo senza progressi da parte di AWS Glue. Quindi il processo potrebbe interrompersi a causa di problemi di spazio su disco (perdita di nodi). Per risolvere il problema, leggi la tabella JDBC in parallelo. Se il processo continua dare esito negativo con perdita di nodi, utilizza un'espressione SQL come predicato pushdown.
Risoluzione
Per risolvere gli errori di perdita di nodi per un set di dati JDBC, utilizza uno o più dei seguenti metodi.
Leggi la tabella JDBC in parallelo
Se la tabella non ha colonne numeriche, come INT o BIGINT, utilizza l'opzione hashfield per partizionare i dati. Imposta hashfield sul nome di una colonna della tabella JDBC. Per ottenere risultati ottimali, scegli una colonna con una distribuzione uniforme dei valori.
Se la tabella ha colonne numeriche, imposta le opzioni hashpartitions e hashexpression nella tabella o durante la creazione del DynamicFrame. Per ulteriori informazioni, consulta Lettura in parallelo dalle tabelle JDBC.
Di seguito è riportato un esempio di come impostare hashpartitions e hashexpression quando crei un DynamicFrame con una connessione JDBC. In connection_option, sostituisci l'URL di JDBC, il nome utente, la password, il nome della tabella e il nome della colonna.
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")
Nota: sostituisci l'URL di JDBC, your_user_name, your_password, your_table e column_name con le tue informazioni.
Di seguito è riportato un esempio di come impostare hashpartitions e hashexpression quando crei un DynamicFrame dal Catalogo dati AWS Glue:
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "your_database", table_name = "your_table",additional_options={"hashexpression":"column_name","hashpartitions":"10"}, transformation_ctx = "datasource0")
Nota: se imposti valori più grandi per hashpartitions, puoi ridurre le prestazioni della tabella. Ciò accade perché ogni attività legge l'intera tabella per poi restituire un set di righe all'esecutore.
Utilizza un'espressione SQL come predicato pushdown
Nota: la seguente espressione SQL non funziona come predicato pushdown per i database Oracle. L'espressione funziona come predicato pushdown per tutti gli altri database supportati in modo nativo da AWS Glue come, ad esempio, Amazon Aurora, MariaDB, Microsoft SQL Server, MySQL e PostgreSQL.
Se la tabella contiene miliardi di record e tebibyte (TiB) di dati, il completamento del processo potrebbe richiedere molto tempo o avere esito negativo con la perdita di nodi. Questo ritardo o errore può verificarsi anche dopo aver impostato hashpartitions e hashexpression. Per ovviare a questi problemi, utilizza un'espressione SQL simile alla seguente con l'opzione hashexpression:
column_name > 1000 AND column_name < 2000 AND column_name
L'espressione SQL funge da predicato pushdown. L'espressione impone al processo di leggere un set di righe per esecuzione del processo, anziché leggere tutti i dati contemporaneamente. L'istruzione completa è simile alla seguente:
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")
Nota: disattiva i segnalibri dei processi per la loro esecuzione iniziale con questa configurazione. Quando esegui un processo con un segnalibro, AWS Glue registra il valore massimo della colonna. Quando esegui nuovamente il processo, AWS Glue elabora solo le righe con valori maggiori rispetto al valore del segnalibro precedente. Attiva i segnalibri dei processi durante l'ultima esecuzione, se necessario.
Informazioni correlate

Contenuto pertinente
AWS UFFICIALEAggiornata 7 mesi fa