Salta al contenuto

Come posso risolvere l'errore "Container killed on request. Exit code is 137" che ricevo da un processo Spark in Amazon EMR?

5 minuti di lettura
0

Il mio processo Apache Spark in Amazon EMR non riesce e ricevo l'errore "Container killed on request. Exit code is 137".

Breve descrizione

Quando un container esaurisce la memoria, YARN lo arresta automaticamente e potresti ricevere il seguente messaggio di errore:

"Container killed on request" stage failure: Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 2 in stage 3.0 failed 4 times, most recent failure: Lost task 2.3 in stage 3.0 (TID 23, ip-###-###-##-###.compute.internal, executor 4): ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Container marked as failed: container_1516900607498_6585_01_000008 on host: ip-###-###-##-###.compute.internal. Exit status: 137. Diagnostics: Container killed on request. Exit code is 137"

Risoluzione

Aumenta la memoria del driver o del container

Per aumentare la memoria del container del cluster o del singolo processo in esecuzione, prima connettiti al nodo primario del cluster. Quindi modifica i parametri spark.executor.memory o spark.driver.memory nel file di configurazione di Spark spark-defaults.conf.

Cluster in esecuzione

Per aprire spark-defaults.conf, esegui questo comando:

sudo vim /etc/spark/conf/spark-defaults.conf

Per aumentare la memoria del container, aggiungi o modifica il parametro spark.executor.memory o spark.driver.memory in spark-defaults.conf:

spark.executor.memory 10g
spark.driver.memory 10g

Nota: sostituisci 10g con un valore appropriato per le risorse disponibili e i requisiti del carico di lavoro del tuo cluster.

Processo singolo

Per aumentare la memoria, utilizza l'opzione --executor-memory o --driver-memory quando esegui questo comando spark-submit:

spark-submit
  --executor-memory 10g
  --driver-memory 10g
  ...

Nota: sostituisci 10g con un valore appropriato per le risorse disponibili e i requisiti del carico di lavoro del tuo cluster.

Puoi anche impostare maximizeResourceAllocation su true nella classificazione della configurazione di spark.

Aggiungi altre partizioni Spark

Se non riesci ad aumentare la memoria del container, aumenta il numero di partizioni Spark per ridurre la quantità di dati elaborati e la memoria utilizzata.

Per aggiungere altre partizioni Spark, prima connettiti al nodo primario del cluster, quindi esegui questi comandi nella shell Spark:

val numPartitions = 500
val newDF = df.repartition(numPartitions)

Nota: sostituisci 500 con il numero di partizioni che si adattano alle dimensioni dei tuoi dati.

Aumenta il numero di partizioni shuffle

Se il problema si verifica durante una trasformazione di una certa entità, ad esempio join o groupBy, connettiti al nodo primario del cluster e aggiungi altre partizioni shuffle. Il valore predefinito è 200.

Cluster in esecuzione

Per aprire spark-defaults.conf, esegui questo comando:

sudo vim /etc/spark/conf/spark-defaults.conf

Per aggiungere partizioni shuffle al file di configurazione, esegui questo comando:

spark.sql.shuffle.partitions 500

Nota: sostituisci 500 con il numero di partizioni che si adattano alle dimensioni dei tuoi dati.

Processo singolo

Per aggiungere partizioni shuffle, utilizza l'opzione --conf spark.sql.shuffle.partitions quando esegui spark-submit:

spark-submit
  --conf
  spark.sql.shuffle.partitions=500
  ...

Nota: sostituisci 500 con il numero di partizioni che si adattano alle dimensioni dei tuoi dati.

Riduci il numero di core dell’esecutore

Quando riduci il numero di core dell'esecutore, riduci anche il numero massimo di attività che l'esecutore elabora contemporaneamente. Ciò riduce la quantità di memoria utilizzata dal container. Per ridurre il numero di core dell’esecutore, prima connettiti al nodo primario del cluster, quindi modifica il parametro relativo ai core dell’esecutore.

Cluster in esecuzione

Apri il file spark-defaults.conf nel nodo primario:

sudo vim /etc/spark/conf/spark-defaults.conf

Per ridurre il numero di core dell'esecutore, modifica il parametro spark.executor.cores:

spark.executor.cores  1

Nota: sostituisci 1 con il numero minimo di core dell'esecutore di cui hai bisogno.

Processo singolo

Per ridurre il numero di core dell'esecutore, utilizza l'opzione --executor-cores quando esegui spark-submit:

spark-submit
   --executor-cores 1
   ...

Aumenta le dimensioni dell'istanza

Quando la memoria del sistema operativo si esaurisce, anche il sistema operativo oom_reaper potrebbe arrestare i container YARN. Se oom_reaper ha causato l'errore, utilizza un'istanza Amazon Elastic Compute Cloud (Amazon EC2) più grande con più RAM. Per assicurarti che i container YARN non utilizzino tutta la RAM, riduci yarn.nodemanager.resource.memory-mb.

Per determinare se oom_reaper ha causato l'errore, esamina l'output del comando dmesg nei log dell'istanza Amazon EMR. Prima di tutto, utilizza l'interfaccia utente o i log di YARN Resource Manager per individuare il nodo principale o il nodo attività in cui è stato eseguito il container YARN arrestato. Quindi controlla i log di stato dell'istanza Amazon EMR nel nodo prima e dopo l'arresto del container.

Nell'esempio seguente, il kernel arresta il processo che ha l'ID 36787 e corrisponde al container YARN container_165487060318_0001_01_000244:

# hows the kernel lookingdmesg | tail -n 25
[ 3910.032284] Out of memory: Kill process 36787 (java) score 96 or sacrifice child
[ 3910.043627] Killed process 36787 (java) total-vm:15864568kB, anon-rss:13876204kB, file-rss:0kB, shmem-rss:0kB
[ 3910.748373] oom_reaper: reaped process 36787 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

Verifica l'utilizzo del disco e il degrado del nodo

Se le precedenti opzioni di risoluzione non risolvono il problema, utilizza il flag df-h nei log di stato dell'istanza per verificare l'utilizzo del disco e il degrado del nodo. Controlla anche la condizione del nodo sulla Dashboard AWS Health.

Informazioni correlate

Come posso risolvere l'errore “Container killed by YARN for exceeding memory limits” in Spark su Amazon EMR?

Come posso risolvere gli errori di fase nei processi Spark in Amazon EMR?

AWS UFFICIALEAggiornata 8 mesi fa