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 ?

Date de la dernière mise à jour : 09/04/2019

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 ?

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

Ré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é, jusqu'à ce que l'erreur soit résolue. Avant de passer à une autre méthode, 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 %. 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 Amazon Elastic Compute Cloud (Amazon EC2) :

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. 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. 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. 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 d'exécuteur lorsque vous exécutez spark-submit. 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. Étant donné que Spark utilise une RAM de cluster pour maximiser la vitesse de manière efficace, il est important de surveiller l'utilisation de la mémoire à l'aide de Ganglia, puis de vérifier que les paramètres du cluster et la 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.

Augmentation de 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. 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

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. Elle 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 et augmenter le risque d'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 continuez à recevoir des exceptions de mémoire après avoir modifié les types d'instance, essayez les méthodes mentionnées plus haut dans l'article sur la nouvelle instance.

Cette page vous a-t-elle été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?