Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
Perché il mio processo ETL di AWS Glue ha esito negativo con l'errore "Container killed by YARN for exceeding memory limits"?
Il mio processo di estrazione, trasformazione e caricamento (ETL) di AWS Glue ha esito negativo e viene visualizzato l'errore "Container killed by YARN for exceeding memory limits".
Breve descrizione
Le cause più comuni di questo errore sono le seguenti:
- Operazioni ad alta intensità di memoria che superano la soglia di memoria del cluster Apache Spark sottostante. Queste operazioni possono includere l'unione di tabelle di grandi dimensioni o l'elaborazione di set di dati con una distribuzione asimmetrica.
- Partizioni complesse di dati che consumano più memoria di quella assegnata al rispettivo esecutore.
- File di grandi dimensioni che non è possibile dividere e che generano grandi partizioni in memoria.
Risoluzione
Per risolvere questo errore, completa una o più delle seguenti soluzioni.
Aggiorna il tipo di worker
Poiché G.2x ha configurazioni di memoria più elevate, aggiorna il tipo di worker. Puoi aggiornare il tipo di worker da G.1x ai seguenti tipi:
- G.2x
- G.4x
- G.8x
- G.12x
- G.16x
- R.1x
- R.2x
- R.4x
- R.8x
Per ulteriori informazioni sulle specifiche dei tipi di worker, consulta Definire le proprietà di processo per i processi Spark e Versioni di AWS Glue.
Aumenta gli esecutori per il processo
Se l'errore persiste dopo l'aggiornamento del tipo di worker, aumenta il numero di esecutori per il processo. Per ogni esecutore, c'è un certo numero di core. Questo numero determina il numero di partizioni che possono essere elaborate dall'esecutore. Il tipo di worker definisce le configurazioni Spark per le unità di elaborazione dati (DPU).
Aggiorna i dati
Per assicurarti che AWS Glue utilizzi in modo uniforme gli esecutori prima di un'operazione di shuffle, ad esempio un join, verifica che i dati siano paralleli. Per ripartizionare i dati tra tutti gli esecutori, includi uno di questi comandi nel processo ETL.
Per DynamicFrame, includi questo comando:
dynamicFrame.repartition(totalNumberOfExecutorCores)
Per DataFrame, includi questo comando:
dataframe.repartition(totalNumberOfExecutorCores)
Utilizza segnalibri per i processi
Quando utilizzi segnalibri per i processi, il processo di AWS Glue solo i file appena scritti. Questa configurazione riduce il numero di file elaborati dal processo di AWS Glue e, pertanto, i problemi di memoria. I segnalibri memorizzano i metadati dei file elaborati dell'esecuzione precedente. Nell'esecuzione successiva, il processo confronta il timestamp e decide se elaborarli nuovamente. Per ulteriori informazioni, consulta Monitoraggio dei dati elaborati mediante segnalibri di processo.
Utilizza DynamicFrame per leggere i dati in parallelo
Quando ti connetti a una tabella JDBC, per impostazione predefinita Spark apre solo una connessione concorrente. Il driver tenta di scaricare l'intera tabella in una sola volta in un unico esecutore Spark. Questo download potrebbe richiedere più tempo e causare errori di memoria insufficiente (OOM) per l'esecutore. Configura invece proprietà specifiche della tabella JDBC per istruire AWS Glue in modo da utilizzare DynamicFrame per leggere i dati in parallelo. Oppure puoi usare Spark DataFrame per ottenere letture parallele da JDBC. Per ulteriori informazioni, consulta JDBC to other databases (Da JDBC ad altri database) sul sito web Spark.
Utilizza funzioni con prestazioni migliori nel processo ETL
Non utilizzare funzioni definite dall'utente per il processo ETL, specialmente quando combini un codice Python o Scala con le funzioni e i metodi di Spark. Ad esempio, non utilizzare df.count() di Spark per verificare DataFrame vuoti nelle istruzioni if/else o nei loop for. Utilizza invece funzioni con prestazioni migliori, come df.schema() o df.rdd.isEmpty().
Verifica e ottimizza il processo di AWS Glue
Prima di eseguire il processo di AWS Glue in produzione, verificalo in una sessione interattiva e ottimizza il codice ETL.
Se nessuna delle soluzioni precedenti risolve il problema, dividi i dati di input in blocchi o partizioni. Quindi esegui più processi ETL di AWS Glue invece di eseguire un unico grande processo. Per ulteriori informazioni, consulta Partizionamento del carico di lavoro con esecuzione delimitata.
Informazioni correlate
Debug di eccezioni di memoria esaurita (OOM) e anomalie dei processi
Best practices to scale Apache Spark jobs and partition data with AWS Glue (Best practice per scalare i processi di Apache Spark e partizionare i dati con AWS Glue)
Optimize memory management in AWS Glue (Ottimizzazione della gestione della memoria in AWS Glue)
