Come faccio a risolvere il "java.lang.OutOfMemoryError": Errore "Java heap space" in un job di AWS Glue Spark?
Il mio lavoro su AWS Glue fallisce con "Comando fallito con codice di uscita 1". Amazon CloudWatch Logs mostra il "java.lang.OutOfMemoryError: Errore "Java heap space".
Breve descrizione
L'errore "java.lang.OutOfMemoryMemory: L'errore "Java heap space" indica che un driver o un esecutore sta esaurendo la memoria JVM. Per determinare se un driver o un esecutore causa l'OOM, vedi Debug delle eccezioni OOM e delle anomalie dei processi.
Nota: La risoluzione seguente è valida solo per le eccezioni OOM del driver.
Le eccezioni OOM del driver sono causate da quanto segue:
- Il job AWS Glue Spark legge un gran numero di piccoli file da Amazon Simple Storage Service (Amazon S3)
- Operazioni intensive come collect(), Broadcast joins e Shared variable
Risoluzione
Risolvi le eccezioni OOM del driver causate da un numero elevato di file di piccole dimensioni
Per risolvere le eccezioni OOM del driver causate da un numero elevato di file di piccole dimensioni con DynamicFrames, utilizzare uno o più dei seguenti metodi.
Attiva UseS3List Implementation
Quando elenca i file, AWS Glue crea un indice di file negli elenchi di memoria dei driver. Quando imposti Uses3ListImplementation su True, AWS Glue non memorizza nella cache l'elenco dei file nella memoria contemporaneamente. Invece, AWS Glue memorizza l'elenco in batch. Ciò significa che è meno probabile che il driver esaurisca la memoria.
Guarda il seguente esempio di come attivare Uses3ListImplementation con from_catalog:
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")
Guarda il seguente esempio che attiva Uses3ListImplementation con from\ _options:
datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")
La funzione UseS3ListImplementation è un'implementazione dell'operazione ListKeys di Amazon S3. Questo suddivide set di risultati di grandi dimensioni in più risposte. È consigliabile utilizzare Uses3ListImplementation con i segnalibri dei lavori.
Raggruppamento
Un'applicazione Spark elabora ogni piccolo file utilizzando un'attività Spark diversa. Questo può portare a OOM perché il driver memorizza e tiene traccia della posizione e delle informazioni sull'attività. Quando si attiva la funzione di raggruppamento, le attività elaborano un gruppo di più file anziché singoli file. Il raggruppamento viene attivato automaticamente quando si utilizzano frame dinamici e quando il set di dati Amazon S3 contiene più di 50.000 file. Per ulteriori informazioni, vedi Lettura dei file di input in gruppi più grandi.
Filtraggio con predicati push down
Riduci il numero di file Amazon S3 e di partizioni Amazon S3 letti dal job AWS Glue utilizzando predicati push down. Questo elimina le partizioni non necessarie dalla tabella AWS Glue prima che i dati sottostanti vengano letti. Per ulteriori informazioni, consulta Prefiltraggio mediante predicati pushdown.
Eccezioni OOM del driver causate da operazioni gravose del conducente
Risolvi le eccezioni OOM del driver causate da operazioni pesanti del driver utilizzando uno dei seguenti metodi.
Fai attenzione alle operazioni che richiedono un uso intensivo dei conducenti
collect() è un'operazione Spark che raccoglie i risultati dai lavoratori e li restituisce al driver come un singolo oggetto. I risultati possono essere molto ampi e ciò travolge il conducente. Per impostazione predefinita, la configurazione Spark spark.driver.maxResultSize è impostata su 1 GB e aiuta a proteggere il driver da sovraccarichi.
Quindi, limita queste azioni e usa invece azioni come take (), takeSample() o isEmpty() ove possibile.
Inoltre, tieni presente che i broadcast join in Spark possono causare errori OOM se la relazione (tabella) è più grande della memoria disponibile del driver. Prima che una relazione venga trasmessa agli esecutori, viene materializzata nel nodo driver. Se vengono trasmesse più tabelle o la relazione è troppo grande, il driver potrebbe riscontrare una carenza di memoria. Usa la configurazione Spark spark.sql.autoBroadcastJoinThreshold e Spark Join Hints per controllarlo.
Distruggi regolarmente le variabili condivise
Assicurati di usare le variabili condivise con attenzione. Distruggi le variabili condivise quando non ne hai più bisogno perché possono causare eccezioni OOM del driver Spark. Esistono due tipi di variabili condivise, variabili di trasmissione e accumulatori.
- Le variabili di trasmissione sono dati di sola lettura che vengono inviati agli esecutori una sola volta. Sono una buona soluzione per archiviare dati di riferimento immutabili come piccoli dizionari o piccole tabelle condivise tra tutti gli esecutori.
- Gli accumulatori forniscono una copia scrivibile tra gli esecutori Spark e possono essere utilizzati per implementare contatori o somme distribuiti (come in MapReduce).
Risoluzione di problemi aggiuntiva
- Analizza il tuo set di dati e seleziona il tipo di lavoratore giusto per il tuo lavoro. Valuta la scalabilità fino a G.1X o G.2X.
- Usa i log di CloudWatch e le metriche di CloudWatchper analizzare la memoria del driver. Configura gli allarmi CloudWatch per avvisarti quando determinate soglie vengono superate nel tuo lavoro.
- Attiva Spark UI per il tuo lavoro su AWS Glue e visualizza i log degli eventi Spark per capire perché si verifica l'OOM. Per ulteriori informazioni, consulta Monitoraggio dei processi utilizzando l'interfaccia utente web di Apache Spark.
Informazioni correlate
Ottimizza la gestione della memoria in AWS Glue
Lettura di file di input in gruppi più grandi
Monitoraggio dei processi utilizzando l'interfaccia utente web di Apache Spark
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 3 anni fa
- AWS UFFICIALEAggiornata 2 anni fa