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

6 minuti di lettura
0

Desidero risolvere l'errore “Container killed by YARN for exceeding memory limits” in Spark su Amazon EMR.

Breve descrizione

Utilizza uno dei seguenti metodi per risolvere questo errore:

  • Aumenta il sovraccarico di memoria.
  • Riduci il numero di core dell’esecutore.
  • Aumenta il numero di partizioni.
  • Aumenta la memoria del driver e dell'esecutore.

Risoluzione

La causa principale e la soluzione appropriata di questo errore dipendono dal carico di lavoro. Per risolvere l’errore, potrebbe essere necessario provare ciascuno dei seguenti metodi, nell'ordine indicato. Prima di passare al metodo successivo in questa sequenza, annulla le modifiche apportate a spark-defaults.conf nella sezione precedente.

Aumento del sovraccarico di memoria

Il sovraccarico di memoria è la quantità di memoria off-heap allocata a ciascun esecutore. Per impostazione predefinita, il sovraccarico di memoria è impostato sul 10% della memoria dell'esecutore o su 384, a seconda di quale sia il valore più elevato. Il sovraccarico di memoria viene utilizzato per buffer diretti Java NIO, stack di thread, librerie native condivise o file mappati in memoria.

Considera l'idea di aumentare gradualmente il sovraccarico di memoria fino al 25%. La somma della memoria del driver o dell'esecutore più il sovraccarico di 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'esecutore, valuta la possibilità di aumentare il sovraccarico di memoria solo per quel container. È possibile aumentare il sovraccarico di memoria mentre il cluster è in esecuzione, quando si avvia un nuovo cluster o quando si invia un processo.

In un cluster in esecuzione:

Modifica spark-defaults.conf sul nodo principale.

Ad esempio:

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

spark.driver.memoryOverhead 512
spark.executor.memoryOverhead 512

In un nuovo cluster:

Aggiungi un oggetto di configurazione simile al seguente quando avvii un cluster:

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

In un singolo processo:

Usa l'opzione --conf per aumentare il sovraccarico di memoria quando esegui spark-submit.

Ad 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 l'aumento del sovraccarico di memoria non risolve il problema, riduci il numero di core dell’esecutore.

Riduzione del numero di core dell’esecutore

Questa operazione consente di ridurre il numero massimo di attività che l'esecutore può eseguire, riducendo la quantità di memoria richiesta. A seconda del container del driver che genera questo errore o dell'altro container di esecutori che riceve questo errore, considera di ridurre i core del driver o dell’esecutore.

In un cluster in esecuzione:

Modifica spark-defaults.conf sul nodo principale.

Ad esempio:

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

In un nuovo cluster:

Aggiungi un oggetto di configurazione simile al seguente quando avvii un cluster:

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

In un singolo processo:

Usa l'opzione --executor-cores per ridurre il numero di core dell’esecutore quando esegui spark-submit.

Ad 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 il messaggio di errore persiste, aumenta il numero di partizioni.

Aumento del numero di partizioni

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 (). L'aumento del numero di partizioni riduce la quantità di memoria richiesta per partizione. Spark utilizza ampiamente la RAM del cluster come metodo efficace per massimizzare la velocità. Pertanto, è necessario monitorare l'utilizzo della memoria con Ganglia, quindi verificare che le impostazioni del cluster e la strategia di partizionamento soddisfino le crescenti esigenze 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'esecutore.

Aumento della memoria del driver e dell'esecutore

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

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

In un cluster in esecuzione:

Modifica spark-defaults.conf sul nodo principale.

Esempio:

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

spark.executor.memory  1g
spark.driver.memory  1g

In un nuovo cluster:

Aggiungi un oggetto di configurazione simile al seguente quando avvii un cluster:

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

In un singolo processo:

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

Ad 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

Altre opzioni risolutive

Se continui a ricevere il messaggio di errore, prova queste soluzioni:

  • Analisi comparativa: È buona norma eseguire l'applicazione su un set di dati campione. In questo modo, puoi individuare rallentamenti e partizioni asimmetriche che possono causare problemi di memoria.
  • Filtrazione dei dati: Assicurati di elaborare la quantità minima di dati. 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.
  • Dimensioni del set di dati: È buona norma elaborare la quantità minima di dati richiesti. Partiziona i dati in modo che vengano acquisiti solo i dati richiesti.
  • Strategia di partizionamento: Considera la possibilità di utilizzare una strategia di partizionamento diversa. Ad esempio, esegui il partizionamento su una chiave alternativa per evitare partizioni di grandi dimensioni e partizioni asimmetriche.
  • Tipo di istanza EC2: È possibile che l'istanza EC2 non disponga delle risorse di memoria necessarie per il carico di lavoro. Il passaggio a un tipo di istanza più grande e con memoria ottimizzata potrebbe risolvere l'errore. Se ricevi ancora eccezioni di memoria dopo avere modificato i tipi di istanza, prova i metodi di risoluzione dei problemi sulla nuova istanza.

Informazioni correlate

Configurazione Spark

Come si risolve la "java.lang.ClassNotFoundException" in Spark su Amazon EMR?

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa