Perché il processo AWS Glue si interrompe a causa di una perdita di nodi quando eseguo la migrazione di un set di dati di grandi dimensioni da Amazon RDS ad Amazon S3?

4 minuti di lettura
0

Sto migrando un set di dati di grandi dimensioni da Amazon Relational Database Service (Amazon RDS) o da un database JDBC locale ad Amazon Simple Storage Service (Amazon S3) utilizzando AWS Glue. Il processo ETL viene eseguito a lungo e poi si interrompe a causa di una perdita di nodi.

Breve descrizione

AWS Glue utilizza un'unica connessione per leggere l'intero set di dati. Se stai migrando una tabella JDBC di grandi dimensioni, il processo ETL potrebbe essere eseguito a lungo senza segni di progresso in AWS Glue. Quindi, il processo potrebbe interrompersi a causa di problemi di spazio su disco (perdita di nodi). Per risolvere questo problema, leggi la tabella JDBC in parallelo. Se il processo continua a interrompersi a causa della perdita di nodi, usa un'espressione SQL come predicato pushdown.

Risoluzione

Utilizza uno o più dei seguenti metodi per risolvere gli errori dovuti alla perdita di nodi per i set di dati JDBC.

Lettura della tabella JDBC in parallelo

Se la tabella non ha colonne numeriche (INT o BIGINT), usa l'opzione hashfield per partizionare i dati. Imposta hashfield sul nome di una colonna della tabella JDBC. Per risultati ottimali, scegli una colonna con una distribuzione uniforme dei valori.

Se la tabella contiene colonne numeriche, imposta le opzioni hashpartitions e hashexpression nella tabella o durante la creazione di DynamicFrame:

  • hashpartitions: definisce il numero di attività che AWS Glue crea per leggere i dati
  • hashexpression: divide le righe in modo uniforme tra le attività

L’esempio seguente mostra come impostare hashpartitions e hashexpression durante la creazione di un DynamicFrame con una connessione JDBC. In connection_option sostituisci l'URL 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")

Questo esempio mostra come impostare hashpartitions e hashexpression durante la creazione di un DynamicFrame dal catalogo 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 le hashpartitions, le prestazioni della tabella potrebbero diminuire. dato che ogni attività legge l'intera tabella per poi restituire un set di righe all'esecutore.

Per ulteriori informazioni, consulta Reading from JDBC tables in parallel.

Uso di un'espressione SQL come predicato pushdown

Nota: la seguente espressione SQL non funziona come predicato pushdown per i database Oracle. Tuttavia, questa espressione può essere utilizzata come predicato pushdown per tutti gli altri database supportati nativamente da AWS Glue (Amazon Aurora, MariaDB, Microsoft SQL Server, MySQL e PostgreSQL).

Se la tabella contiene miliardi di record e tebibyte (TiB) di dati, per completare il processo potrebbe essere necessario molto tempo oppure il processo potrebbe interrompersi a causa di una perdita di nodi, anche dopo avere impostato hashpartitions e hashexpression. Per risolvere questi problemi, usa un'espressione SQL simile alla seguente con l'opzione hashexpression:

column_name > 1000 AND column_name < 2000 AND column_name

L'espressione SQL agisce come predicato pushdown e forza il processo a leggere un unico set di righe per ogni processo eseguito, 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: assicurati di disattivare i segnalibri dei processi per l'esecuzione iniziale dei processi con questa configurazione. Quando esegui un processo con un segnalibro di processo, 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. È possibile attivare i segnalibri dei processi durante l'ultima esecuzione del processo, se necessario.


Informazioni correlate

Why is my AWS Glue job failing with the error "Exit status: -100. Diagnostics: Container released on a *lost* node"?

Defining connections in the AWS Glue Data Catalog

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa