Comment empêcher le cache utilisateur d'une tâche Hadoop ou Spark de consommer trop d'espace disque dans Amazon EMR ?

Date de la dernière mise à jour : 11/02/2020

Le cache utilisateur de ma tâche Apache Hadoop ou Apache Spark occupe tout l'espace disque sur la partition. La tâche Amazon EMR échoue ou le service HDFS NameNode est en mode sans échec. Comment résoudre ce problème ?

Brève description

Sur un cluster Amazon EMR, YARN est configuré pour permettre aux tâches d'écrire des données de cache dans /mnt/yarn/usercache. Lorsque vous traitez une grande quantité de données ou exécutez plusieurs tâches simultanées, le système de fichiers /mnt peut se remplir. Cela entraîne des défaillances des gestionnaires de nœuds sur certains nœuds, ce qui provoque ensuite le blocage ou l'échec de la tâche.

Utilisez l'une des méthodes suivantes pour résoudre ce problème :

  • Ajustez les paramètres de conservation du cache utilisateur pour YARN NodeManager. Choisissez cette option si vous n'avez pas de tâches de longue durée ou de tâches de diffusion en continu.
  • Augmentez les volumes Amazon Elastic Block Store (Amazon EBS). Choisissez cette option si vous avez des tâches de longue durée ou des tâches de diffusion en continu.

Solution

Option 1 : ajuster les paramètres de conservation du cache utilisateur pour NodeManager

Les attributs suivants définissent les paramètres de nettoyage du cache :

  • yarn.nodemanager.localizer.cache.cleanup.interval-ms : il s'agit de l'intervalle de nettoyage du cache. La valeur par défaut est 600 000 millisecondes. Après cet intervalle, si la taille du cache dépasse la valeur définie dans yarn.nodemanager.localizer.cache.target-side-mb, les fichiers qui ne sont pas en cours d'utilisation par les conteneurs en cours d'exécution sont supprimés.
  • yarn.nodemanager.localizer.cache.target-size mb : il s'agit de l'espace disque maximal autorisé pour le cache. La valeur par défaut est 10,240 Mo. Lorsque la taille du disque de cache dépasse cette valeur, les fichiers qui ne sont pas utilisés par les conteneurs en cours d'exécution sont supprimés selon l'intervalle défini dans yarn.nodemanager.localizer.cache.cleanup.interval-ms.

Pour définir l'intervalle de nettoyage et la taille maximale de l'espace disque sur un cluster en cours d'exécution :

1.    Ouvrez /etc/hadoop/conf/yarn-site.xml sur chaque nœud principal et de tâche, puis réduisez les valeurs pour yarn.nodemanager.localizer.cache.cleanup.interval et yarn.nodemanager.localizer.cache.target-sie-mb. Exemple :

sudo vim /etc/hadoop/conf/yarn-site.xml

yarn.nodemanager.localizer.cache.cleanup.interval-ms 400000
yarn.nodemanager.localizer.cache.target-size-mb 5120

2.    Pour redémarrer le service NodeManager, exécutez les commandes suivantes sur chaque nœud principal et de tâche :

sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager

Remarque : dans Amazon EMR versions 5.21.0 et les versions ultérieures, vous pouvez également utiliser un objet de configuration, similaire à ce qui suit, pour remplacer la configuration du cluster ou spécifier des classifications de configuration supplémentaires pour un cluster en cours d'exécution. Pour plus d'informations, consultez Fourniture d'une configuration pour un groupe d'instances dans un cluster en cours d'exécution.

Pour définir l'intervalle de nettoyage et la taille maximale de l'espace disque sur un nouveau cluster, ajoutez un objet de configuration similaire à ce qui suit lorsque vous lancez le cluster :

[
    {
      "Classification": "yarn-site",
     "Properties": {
       "yarn.nodemanager.localizer.cache.cleanup.interval-ms": "400000",
       "yarn.nodemanager.localizer.cache.target-size-mb": "5120"
      }
    }
]

Notez que le service de suppression ne s'exécute pas sur les conteneurs en cours d'exécution. Cela signifie que même après avoir ajusté les paramètres de conservation du cache utilisateur, les données peuvent continuer à se déverser vers le chemin suivant et remplir le système de fichiers :

{'yarn.nodemanager.local-dirs'}/usercache/user/appcache/application_id ,

Option 2 : Augmenter les volumes EBS sur les nœuds de cluster EMR

Pour augmenter le stockage sur un cluster EMR en cours d'exécution, consultez Augmentation dynamique du stockage sur les clusters Amazon EMR.

Pour augmenter le stockage sur un nouveau cluster EMR, spécifiez une taille de volume plus importante lorsque vous créez le cluster EMR. Vous pouvez également le faire lorsque vous ajoutez des nœuds à un cluster existant :

  • Amazon EMR version 5.22.0 et versions ultérieures : la quantité par défaut de stockage EBS augmente en fonction de la taille de l'instance Amazon Elastic Compute Cloud (Amazon EC2). Pour plus d'informations sur la quantité de stockage et le nombre de volumes alloués pour chaque type d'instance, consultez Stockage EBS par défaut pour les instances.
  • Amazon EMR versions 5.21 et versions antérieures : la taille du volume EBS par défaut est de 32 Go. 27 Go sont réservés à la partition /mnt . HDFS, YARN, le cache utilisateur et toutes les applications utilisent la partition /mnt . Augmentez la taille de votre volume EBS en fonction des besoins (par exemple, 100 à 500 Go ou plus). Vous pouvez également spécifier plusieurs volumes EBS. Plusieurs volumes EBS seront montés en tant que /mnt1, /mnt2, etc.

Pour les tâches de diffusion en continu Spark, vous pouvez également effectuer une opération de non persistance (RDD.unpersist()) lorsque le traitement est terminé et que les données ne sont plus nécessaires. Ou bien appelez explicitement System.gc () dans Scala (sc._jvm.System.gc() dans Python) pour démarrer le nettoyage de la mémoire de la JVM et supprimer les fichiers aléatoires intermédiaires.


Cet article vous a-t-il été utile ?

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


Vous avez besoin d’aide ?