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 ?
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
Comment résoudre l'erreur « java.lang.ClassNotFoundException » sur Spark dans Amazon EMR ?
Vidéos associées
Contenus pertinents
- demandé il y a 4 moislg...
- demandé il y a un anlg...
- demandé il y a un anlg...
- demandé il y a un anlg...
- demandé il y a 2 anslg...
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a 3 ans
- AWS OFFICIELA mis à jour il y a 2 ans