Salta al contenuto

Come posso risolvere un "ExecutorLostFailure: Slave lost" in Spark su Amazon EMR?

5 minuti di lettura
0

Ho inviato un'applicazione Apache Spark a un cluster Amazon EMR e l'applicazione ha esito negativo con un errore "ExecutorLostFailure: Slave lost".

Risoluzione

Quando un'attività Spark ha esito negativo perché un nodo termina o diventa non disponibile, potresti ricevere il seguente errore:

"Most recent failure: Lost task 1209.0 in stage 4.0 (TID 31219, ip-###-###-##-###.compute.internal, executor 115): ExecutorLostFailure (executor 115 exited caused by one of the running tasks) Reason: Slave lost"

Di seguito sono riportati alcuni dei motivi per cui potresti ricevere questo errore.

Utilizzo elevato del disco a causa di un nodo non integro

In Apache Hadoop, NodeManager controlla periodicamente i volumi Amazon Elastic Block Store (Amazon EBS) collegati ai nodi del cluster. Se l'utilizzo del disco su un nodo con un volume è maggiore della proprietà YARN yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage, NodeManager considera il nodo non integro. Quindi ResourceManager chiude tutti i container sul nodo e non pianifica nuovi container. Per ulteriori informazioni, consulta NodeManager sul sito web di Apache Hadoop.

Dopo che ResourceManager ha chiuso più esecutori a causa di nodi non integri, l'applicazione ha esito negativo con un errore ExecutorLostFailure: Slave lost. Per verificare se un nodo non è integro, esamina i log di NodeManager o i log del controller dell'istanza. La variabile YARN_LOG_DIR in yarn-env.sh definisce la posizione dei log di NodeManager. I log del controller dell'istanza sono archiviati in /emr/instance-controller/log/instance-controller.log nel nodo principale. I log del controller dell'istanza forniscono una vista aggregata di tutti i nodi del cluster.

Un nodo non integro mostra una voce di log simile alla seguente:

2019-10-04 11:09:37,163 INFO Poller: InstanceJointStatusMap contains 40 entries (R:40):  i-006ba######  1829s R   1817s ig-3B ip-###-##-##-### I:    7s Y:U    11s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers
  i-00979######  1828s R   1817s ig-3B ip-###-##-##-### I:    7s Y:R     9s c: 3 am: 2048 H:R  0.0%
  i-016c4######  1834s R   1817s ig-3B ip-###-##-##-### I:   13s Y:R    14s c: 3 am: 2048 H:R  0.0%
  i-01be3######  1832s R   1817s ig-3B ip-###-##-##-### I:   10s Y:U    12s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers

Per risolvere il problema, aumenta le dimensioni dei volumi EBS collegati al nodo principale e al nodo attività. Oppure elimina i dati inutilizzati dall'Hadoop Distributed File System (HDFS).

Istanze spot

Se utilizzi istanze spot Amazon Elastic Compute Cloud (EC2) per i nodi del cluster Amazon EMR e una delle istanze termina, potresti ricevere un errore ExecutorLostFailure: Slave lost. Le istanze spot potrebbero terminare per i seguenti motivi:

  • Il prezzo dell'istanza spot è superiore al prezzo massimo.
  • Le istanze EC2 disponibili non soddisfano la domanda di istanze spot.

Per ulteriori informazioni, consulta Interruzioni dell'istanza spot.

Per risolvere il problema, utilizza le istanze on demand. Oppure, se utilizzi la versione 5.11.0 o precedente di Amazon EMR, esegui l'aggiornamento alla versione più recente.

Policy di Amazon EC2 Auto Scaling

In caso di eventi frequenti di dimensionamento automatico, un nuovo nodo potrebbe ricevere un indirizzo IP utilizzato da un nodo precedente. Se un'applicazione Spark viene eseguita durante un evento di riduzione orizzontale, Spark aggiunge il nodo disattivato all'elenco dei nodi negati in modo che un esecutore non si avvii su quel nodo. Se si verifica un altro evento di aumento orizzontale e il nuovo nodo ottiene lo stesso indirizzo IP del nodo disattivato, YARN considera valido il nuovo nodo. YARN tenta di pianificare esecutori sul nuovo nodo. Poiché il nodo rimane nell'elenco dei nodi negati di Spark, gli avvii degli esecutori hanno esito negativo. Nel momento in cui viene raggiunto il numero massimo di errori, l'applicazione Spark dà esito negativo con l'errore ExecutorLostFailure: Slave lost.

Per risolvere l’errore, intraprendi le seguenti azioni:

Per rimuovere un nodo dall'elenco dei nodi negati di Spark, riduci le proprietà di timeout per Spark e YARN. Completa i seguenti passaggi:

  1. Aggiungi il seguente parametro al file /etc/spark/conf/spark-defaults.conf:
    spark.blacklist.decommissioning.timeout 600s
    Nota: in questo modo si riduce il tempo in cui un nodo in stato di disattivazione rimane nell'elenco dei nodi negati. L'impostazione predefinita è un'ora. Per ulteriori informazioni, consulta Configurazione del comportamento di disattivazione dei nodi.
  2. Modifica la seguente proprietà YARN in /etc/hadoop/conf/yarn-site.xml:
    yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs 600
    Nota: questa proprietà specifica il tempo di attesa per il completamento dei container e delle applicazioni in esecuzione prima che un nodo in fase di disattivazione passi allo stato disattivato. L'impostazione predefinita è 3.600 secondi.

Per ulteriori informazioni, consulta Spark enhancements for elasticity and resiliency on Amazon EMR (Miglioramenti di Spark per l'elasticità e la resilienza su Amazon EMR).

Informazioni correlate

Configurazione dei tipi di istanze del cluster Amazon EMR e delle best practice per le istanze spot

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

AWS UFFICIALEAggiornata un anno fa