Comment résoudre l'erreur « Container killed by YARN for exceeding memory limits » (« Conteneur supprimé par YARN pour excès des limites de mémoire ») dans Spark sur Amazon EMR ?

Lecture de 6 minute(s)
0

Je souhaite résoudre l'erreur « Container killed by YARN for exceeding memory limits » (Conteneur supprimé par YARN pour excès des limites de mémoire) sur Spark dans Amazon EMR.

Brève description

Utilisez l'une des méthodes suivantes pour résoudre l'erreur :

  • Augmentation de la surcharge de mémoire
  • Réduction du nombre de cœurs de l'exécuteur
  • Augmentation du nombre de partitions
  • Augmentation de la mémoire du pilote et de l'exécuteur

Solution

La cause racine de cette erreur et sa solution dépendent de votre charge de travail. Essayez chacune des méthodes suivantes, dans l'ordre indiqué, afin de résoudre l'erreur. Avant de passer à une autre des méthodes décrite dans cette séquence, inversez toutes les modifications que vous avez apportées à spark-defaults.conf dans la section précédente.

Augmentation de la surcharge de mémoire

La surcharge de mémoire est la quantité de mémoire hors tas allouée à chaque exécuteur. Par défaut, la surcharge de mémoire est définie sur 10 % de la mémoire de l'exécuteur ou sur 384 (par défaut, la plus élevée). La surcharge de mémoire est utilisée pour les tampons directs Java NIO, les piles de thread, les bibliothèques natives partagées ou les fichiers mappés en mémoire.

Envisagez des augmentations progressives de la surcharge de mémoire de jusqu'à 25 %. La somme de la mémoire du pilote ou de l'exécuteur et de la surcharge de mémoire doit être inférieure à la valeur yarn.nodemanager.resource.memory-mb pour votre type d'instance.

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

Si l'erreur se produit dans le conteneur du pilote ou de l'exécuteur, envisagez d'augmenter la surcharge de mémoire pour ce conteneur uniquement. Vous pouvez augmenter la surcharge de mémoire lorsque le cluster est en cours d'exécution, lorsque vous lancez un nouveau cluster ou lorsque vous soumettez une tâche.

Sur un cluster en cours d'exécution :

Modifiez spark-defaults.conf sur le nœud principal.

Par exemple :

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

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

Sur un nouveau cluster :

Ajoutez un objet de configuration similaire à ce qui suit lorsque vous lancez un cluster :

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

Pour une seule tâche :

Utilisez l'option --conf pour augmenter la surcharge de mémoire lorsque vous exécutez spark-submit.

Par exemple :

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

Si l'augmentation de la surcharge de mémoire ne résout pas le problème, réduisez le nombre de cœurs de l'exécuteur.

Réduction du nombre de cœurs de l'exécuteur

Cette méthode permet de réduire le nombre maximum de tâches que l'exécuteur peut effectuer, réduisant ainsi la quantité de mémoire requise. Envisagez de diminuer les cœurs pour le pilote ou l'exécuteur : pour le conteneur de pilote si c'est lui qui lance l'erreur et pour le conteneur de l'exécuteur si c'est lui qui reçoit l'erreur.

Sur un cluster en cours d'exécution :

Modifiez spark-defaults.conf sur le nœud principal.

Par exemple :

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

Sur un nouveau cluster :

Ajoutez un objet de configuration similaire à ce qui suit lorsque vous lancez un cluster :

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

Pour une seule tâche :

Utilisez l'option --executor-cores pour réduire le nombre de cœurs de l'exécuteur lorsque vous exécutez spark-submit.

Par exemple :

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

Si le message d'erreur persiste, augmentez le nombre de partitions.

Augmentation du nombre de partitions

Pour augmenter le nombre de partitions, augmentez la valeur de spark.default.parallelism pour les jeux de données distribués résilients bruts ou exécutez une opération .repartition(). L'augmentation du nombre de partitions réduit la quantité de mémoire requise par partition. Spark utilise fortement la RAM du cluster comme moyen efficace de maximiser la vitesse. Par conséquent, vous devez surveiller l'utilisation de la mémoire avec Ganglia, puis vérifier que les paramètres de votre cluster et votre stratégie de partitionnement répondent à vos besoins croissants en matière de données. Si vous obtenez toujours le message d'erreur « Container killed by YARN for exceeding memory limits » (« Conteneur supprimé par YARN pour excès des limites de mémoire »), augmentez la mémoire du pilote et de l'exécuteur.

Augmenter la mémoire du pilote et de l'exécuteur

Si l'erreur se produit dans un conteneur de pilote ou dans un conteneur d'exécuteur, envisagez d'augmenter la mémoire pour le pilote ou pour l'exécuteur, mais pas pour les deux. Veillez à ce que la somme de la mémoire du pilote ou de l'exécuteur et de la surcharge de mémoire du pilote ou de l'exécuteur soit toujours inférieure à la valeur de yarn.nodemanager.resource.memory-mb pour votre type d'instance EC2:

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

Sur un cluster en cours d'exécution :

Modifiez spark-defaults.conf sur le nœud principal.

Exemple :

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

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

Sur un nouveau cluster :

Ajoutez un objet de configuration similaire à ce qui suit lorsque vous lancez un cluster :

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

Pour une seule tâche :

Utilisez les options --executor-memory et --driver-memory pour augmenter la mémoire lorsque vous exécutez spark-submit.

Par exemple :

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

Autres options de solution

Si le message d'erreur persiste, essayez ce qui suit :

  • Benchmarking : il s'agit d'une bonne pratique visant à exécuter votre application par rapport à un échantillon de série de données. Cette pratique peut vous aider à identifier les ralentissements et les partitions asymétriques qui peuvent entraîner des problèmes de mémoire.
  • Filtration de données : veillez à bien traiter la quantité minimum de données. Si vous ne filtrez pas vos données ou si vous les filtrez à la fin de l'exécution de l'application, les données supplémentaires peuvent ralentir l'application. Cela peut augmenter le risque d'une exception de mémoire.
  • Taille de la série de données : il s'agit d'une pratique recommandée pour traiter les données minimum requises. Partitionnez vos données de façon à ce que seules les données requises soient ingérées.
  • Stratégie de partitionnement : envisagez d'utiliser une autre stratégie de partitionnement. Par exemple, partitionnez vos données sur une clé alternative pour éviter les grandes partitions et les partitions asymétriques.
  • Type d'instance EC2 : il se peut que votre instance EC2 n'ait pas les ressources de mémoire nécessaires pour votre charge de travail. Vous pouvez résoudre l'erreur en passant à un plus grand type d'instance à mémoire optimisée. Si vous obtenez toujours des exceptions de mémoire après avoir modifié les types d'instance, essayez les méthodes de dépannage de la nouvelle instance.

Informations connexes

Configuration de Spark

Comment résoudre l'erreur « java.lang.ClassNotFoundException » sur Spark dans Amazon EMR ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an