Perché il mio processo ETL di AWS Glue fallisce con l'errore "Container terminato da YARN a causa del superamento dei limiti di memoria"?

4 minuti di lettura
0

Il mio processo di estrazione, trasformazione e caricamento (ETL) di AWS Glue ha esito negativo e viene visualizzato l'errore "Container terminato da YARN per aver superato i limiti di memoria”.

Breve descrizione

Le cause più comuni di questo errore sono le seguenti:

  • operazioni che richiedono molta memoria, come l'unione di tabelle di grandi dimensioni o l'elaborazione di set di dati con un'asimmetria nella distribuzione di valori di colonna specifici, che superano la soglia di memoria del cluster Spark sottostante
  • Partizioni complesse di dati che consumano più memoria di quella assegnata al rispettivo esecutore
  • File di grandi dimensioni che non possono essere divisi, con conseguenti partizioni in memoria di grandi dimensioni

Risoluzione

Utilizza una o più delle seguenti opzioni di soluzione per risolvere questo errore:

AWS Glue versioni 1.0 e 2.0
Standardspark.executor.memory: 5g spark.driver.memory: 5g spark.executor.cores: 4
G.1xspark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 8
G.2xspark.executor.memory: 20g spark.driver.memory: 20g spark.executor.cores: 16
AWS Glue versione 3.0
Standardspark.executor.memory: 5g spark.driver.memory: 5g spark.executor.cores: 4
G.1xspark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 4
G.2xspark.executor.memory: 20g spark.driver.memory: 20g spark.executor.cores: 8
  • Se l'errore persiste dopo l'aggiornamento del tipo di lavoro, aumenta il numero di esecutori per il processo. Ogni esecutore ha un determinato numero di core. Questo numero determina il numero di partizioni che possono essere elaborate dall'esecutore. Le configurazioni Spark per le unità di elaborazione dati (DPU) sono definite in base al tipo di lavoro.
  • Assicurati che i dati siano correttamente parallelizzati in modo che gli esecutori possano essere utilizzati in modo uniforme prima di qualsiasi operazione di shuffle, come i join. Puoi ripartizionare i dati tra tutti gli esecutori. Puoi effettuare questa operazione includendo rispettivamente i seguenti comandi per AWS Glue DynamicFrame e Spark DataFrame nel tuo processo ETL.
dynamicFrame.repartition(totalNumberOfExecutorCores)

dataframe.repartition(totalNumberOfExecutorCores)
  • L'uso dei segnalibri del processo consente di elaborare solo i file appena scritti dal processo AWS Glue. Ciò riduce il numero di file elaborati dal processo AWS Glue e riduce i problemi di memoria. I segnalibri memorizzano i metadati relativi ai file elaborati nell'esecuzione precedente. Nell'esecuzione successiva, il processo confronta il timestamp e quindi decide se elaborare nuovamente questi file. Per ulteriori informazioni, consulta Monitoraggio dei dati elaborati utilizzando i segnalibri dei processi.
  • Quando ci si connette a una tabella JDBC, per impostazione predefinita Spark apre solo una connessione simultanea. Il driver tenta di scaricare l'intera tabella contemporaneamente in un singolo executor Spark. Questa operazione potrebbe richiedere più tempo e persino causare errori di memoria insufficiente per l'esecutore. È invece possibile impostare proprietà specifiche della tabella JDBC per indicare ad AWS Glue di leggere i dati in parallelo tramite DynamicFrame. Per ulteriori informazioni, consulta Lettura dalle tabelle JDBC in parallelo. Oppure, puoi ottenere letture parallele da JDBC tramite Spark DataFrame. Per ulteriori informazioni, consulta Letture parallele di Spark DataFrame da JDBC e rivedi le proprietà, quali partitionColumn, lowerBound, upperBound e numPartitions.
  • Evita di utilizzare funzioni definite dall'utente nel tuo processo ETL, specialmente quando combini il codice Python/Scala con le funzioni e i metodi di Spark. Ad esempio, evita di usare df.count() di Spark per verificare DataFrame vuoti nelle istruzioni if/else o nei loop for. Utilizza invece una funzione con prestazioni migliori, come df.schema() o df.rdd.isEmpty().
  • Prova il processo di AWS Glue su un endpoint di sviluppo e ottimizza il codice ETL di conseguenza.
  • Se nessuna delle opzioni di soluzione precedenti funziona, dividi i dati di input in blocchi o partizioni. Quindi, esegui più processi ETL di AWS Glue invece di eseguire un unico processo di grandi dimensioni. Per ulteriori informazioni, consulta Partizionamento del carico di lavoro con esecuzione limitata.

Informazioni correlate

Debug delle eccezioni OOM e delle anomalie del processo

Best practice per scalare i processi di Apache Spark e partizionare i dati con AWS Glue

Ottimizzazione della gestione della memoria in AWS Glue

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa