Salta al contenuto

Come posso risolvere l'errore "Container killed by YARN for exceeding memory limits" di Spark in Amazon EMR?

5 minuti di lettura
0

Desidero risolvere l'errore "Container killed by YARN for exceeding memory limits" di Spark in Amazon EMR.

Risoluzione

La causa principale e la soluzione appropriata di questo errore dipendono dal carico di lavoro. Per risolverlo, utilizza i seguenti metodi di risoluzione, nell'ordine indicato.

Aumenta il sovraccarico della memoria

Il sovraccarico della memoria è la quantità di memoria off-heap allocata a ciascun executor. Per impostazione predefinita, Spark imposta il sovraccarico della memoria sul 10% della memoria dell'executor o su 384, a seconda di quale sia il valore più alto. Il sovraccarico della memoria è utilizzato dai buffer diretti Java NIO, dagli stack di thread, dalle librerie native condivise e dai file mappati in memoria.

Aumenta gradualmente il sovraccarico della memoria, fino al 25%. La somma della memoria del driver o dell'executor e del sovraccarico della memoria deve essere inferiore a yarn.nodemanager.resource.memory-mb per il tipo di istanza:

"spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb"

Se l'errore si verifica nel container del driver o dell'executor, aumenta il sovraccarico della memoria solo per il container in cui si è verificato l'errore. Puoi aumentare il sovraccarico della memoria in un cluster in esecuzione, in un nuovo cluster o quando invii un processo.

Cluster in esecuzione

Modifica spark-defaults.conf nel nodo primario.

Ad esempio:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.driver.memoryOverhead 512
spark.executor.memoryOverhead 512

Nuovo cluster

Quando avvii un cluster EMR, aggiungi un oggetto configurazione simile al seguente esempio:

[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.driver.memoryOverhead": "512",
      "spark.executor.memoryOverhead": "512"
    }
  }
]

Processo singolo

Per aumentare il sovraccarico della memoria quando esegui spark-submit, utilizza l'opzione --conf.

Esempio:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --conf spark.driver.memoryOverhead=512 --conf spark.executor.memoryOverhead=512 /usr/lib/spark/examples/jars/spark-examples.jar 100

Se continui a ricevere l'errore dopo aver aumentato il sovraccarico della memoria, riduci il numero di core dell'executor.

Riduci il numero di core dell’executor

Nota: annulla tutte le modifiche apportate a spark-defaults.conf nella sezione precedente.

Quando riduci il numero di core dell'executor, riduci il numero massimo di attività che l'executor può eseguire, riducendo così la quantità di memoria richiesta. A seconda che l'errore venga riscontrato nel container del driver o dell'executor, riduci il numero di core del driver o dell'executor.

Cluster in esecuzione

Modifica spark-defaults.conf nel nodo primario.

Esempio:

sudo vim /etc/spark/conf/spark-defaults.confspark.driver.cores  3
spark.executor.cores  3

Nuovo cluster

Quando avvii un cluster EMR, aggiungi un oggetto configurazione simile al seguente esempio:

[
  {
    "Classification": "spark-defaults",
    "Properties": {"spark.driver.cores" : "3",
      "spark.executor.cores": "3"
    }
  }
]

Processo singolo

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

Esempio:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-cores 3 --driver-cores 3 /usr/lib/spark/examples/jars/spark-examples.jar 100

Se continui a ricevere il messaggio di errore, aumenta il numero di partizioni.

Aumenti il numero di partizioni

Nota: annulla tutte le modifiche apportate a spark-defaults.conf nella sezione precedente.

Per aumentare il numero di partizioni, aumenta il valore di spark.default.parallelism per i set di dati distribuiti resilienti non elaborati o esegui un'operazione .repartition().

Quando aumenti il numero di partizioni, riduci la quantità di memoria richiesta per partizione. Spark utilizza ampiamente la RAM del cluster come metodo efficace per massimizzare la velocità. Pertanto, devi monitorare l'utilizzo della memoria con Ganglia (per Amazon EMR versione 6.15) o con l'agente Amazon CloudWatch (per Amazon EMR 7.0 e versioni successive). Quindi verifica che le impostazioni del cluster e la strategia di partizionamento soddisfino le crescenti esigenze in termini di dati. Se continui a ricevere il messaggio di errore "Container killed by YARN for exceeding memory limits", aumenta la memoria del driver e dell'executor.

Aumenta la memoria del driver e dell'executor

Nota: annulla tutte le modifiche apportate a spark-defaults.conf nella sezione precedente.

Se l'errore si verifica nel container di un driver o di un executor, valuta la possibilità di aumentare la memoria del driver o dell’executor, ma non di entrambi. Assicurati che la somma della memoria del driver o dell'executor e del sovraccarico della memoria del driver o dell'executor sia sempre inferiore al valore yarn.nodemanager.resource.memory-mb per il tipo di istamza EC2:

"spark.driver/executor.memory + spark.driver/executor.memoryOverhead < yarn.nodemanager.resource.memory-mb"

Cluster in esecuzione

Modifica spark-defaults.conf nel nodo primario.

Esempio:

sudo vim /etc/spark/conf/spark-defaults.conf
spark.executor.memory  1g
spark.driver.memory  1g

Nuovo cluster

Quando avvii il cluster, aggiungi \un oggetto di configurazione simile al seguente:


[  
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executor.memory": "1g",
      "spark.driver.memory":"1g",
    }
  }
]

Processo singolo

Utilizza le opzioni --executor-memory e --driver-memory per aumentare la memoria quando esegui spark-submit.

Esempio:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --executor-memory 1g --driver-memory 1g /usr/lib/spark/examples/jars/spark-examples.jar 100

Altri passaggi per la risoluzione dei problemi:

Se continui a ricevere il messaggio di errore, intraprendi le seguenti azioni:

  • Esegui l'applicazione su un set di dati esemplificativo. Il benchmarking è una best practice e può aiutarti a individuare rallentamenti e partizioni distorte che portano a problemi di memoria.
  • Elabora la quantità minima di dati richiesti. Se non filtri i dati o se li filtri in una fase avanzata dell'applicazione, i dati in eccesso potrebbero rallentare l'applicazione. Ciò può aumentare il rischio che si verifichi un'eccezione di memoria.
  • Partiziona i dati per importare solo i dati richiesti.
  • Utilizza una strategia di partizionamento diversa. Ad esempio, esegui il partizionamento su una chiave alternativa per evitare partizioni di grandi dimensioni e partizioni asimmetriche.
  • L'istanza EC2 potrebbe non disporre delle risorse di memoria necessarie per il carico di lavoro. Passa a un tipo di istanza più grande e ottimizzata per la memoria. Se continui a ricevere eccezioni di memoria dopo aver modificato i tipi di istanza, prova ad applicare i metodi di risoluzione alla nuova istanza.

Informazioni correlate

Spark configuration (Configurazione di Spark) sul sito web Apache Spark

Come posso risolvere l’errore "java.lang.ClassNotFoundException" di Spark in Amazon EMR?

AWS UFFICIALEAggiornata 8 mesi fa