Comment résoudre l'exception « java.lang .OutOfMemoryError: GC overhead limit exceeded » dans Amazon EMR ?

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

Le service NameNode dans Amazon EMR échoue avec l'exception suivante : « java.lang .OutOfMemoryError: GC overhead limit exceeded. »

Brève description

Le service NameNode utilise la mémoire pour stocker les objets d'espace de noms et les métadonnées pour les fichiers stockés dans HDFS. Plus vous avez de fichiers dans HDFS, plus NameNode utilise de mémoire. L'erreur « java.lang .OutOfMemoryError: GC overhead limit exceeded » indique que la taille du tas NameNode est insuffisante pour la quantité de données HDFS dans le cluster. Augmentez la taille du tas pour éviter les exceptions de mémoire insuffisante.

Résolution

Vérifiez les journaux pour confirmer l'erreur

1.    Connectez-vous au nœud principal en utilisant SSH.

2.    Exécutez la commande suivante sur le nœud maître pour vérifier le statut du service NameNode :

initctl list

Le résultat suivant indique que le service NameNode s'est arrêté :

hadoop-hdfs-namenode stop/waiting

3.    Consultez le journal NameNode à l'emplacement suivant pour confirmer l'exception OutofMemory : /var/log/hadoop-hdfs/hadoop-hdfs-namenode-ip-xxxx.out. Remplacez xxxx par l'adresse IP privée du nœud maître (par exemple : /var/log/hadoop-hdfs/hadoop-hdfs-namenode-ip-10-0-1-109.out).

Un tel résultat confirme que le service NameNode a échoué en raison d'une exception OutOfMemory :

# java.lang.OutOfMemoryError: GC overhead limit exceeded
# -XX:OnOutOfMemoryError="kill -9 %p
kill -9 %p

Augmenter la taille du tas NameNode

Important : ce changement de configuration nécessite un redémarrage du service NameNode. Assurez-vous qu'aucune opération de lecture ou d'écriture HDFS n'est en cours pendant que vous effectuez la modification.

Pour les versions 5.21.0 et ultérieures d'Amazon EMR :

Pour augmenter la taille du tas, fournissez un objet de configuration hadoop-env pour le groupe d'instances sur un cluster en cours d'exécution. Vous pouvez également ajouter l'objet de configuration lorsque vous lancez un nouveau cluster. L'objet de configuration suivant augmente la taille du tas de 1 Go à 2 Go. Choisissez une taille adaptée à votre charge de travail.

[
  {
    "Classification": "hadoop-env",
    "Properties": {
      
    },
    "Configurations": [
      {
        "Classification": "export",
        "Properties": {
          "HADOOP_NAMENODE_HEAPSIZE": "2048"
        },
        "Configurations": [
          
        ]
      }
    ]
  }
]

Amazon EMR applique vos nouvelles configurations et redémarre correctement le processus NameNode.

Pour les versions 5.20.0 et antérieures d'Amazon EMR :

1.    Connectez-vous au nœud principal en utilisant SSH.

2.    Augmentez la taille du tas NameNode dans le fichier /etc/hadoop/conf/hadoop-env.sh. Choisissez une taille adaptée à votre charge de travail. Exemple :

export HADOOP_NAMENODE_HEAPSIZE=2048

3.    Enregistrez vos modifications.

4.    Redémarrez le service NameNode :

sudo stop hadoop-hdfs-namenode
sudo start hadoop-hdfs-namenode

5.    Vérifiez que le processus NameNode est en cours d'exécution.

initctl list

Exemple de résultat correct :

hadoop-hdfs-namenode start/running, process 6324

6.    Vérifiez que les commandes HDFS fonctionnent.

hdfs dfs -ls /

Exemple de résultat correct :

Found 4 items
drwxr-xr-x   - hdfs hadoop          0 2019-09-26 14:02 /apps
drwxrwxrwt   - hdfs hadoop          0 2019-09-26 14:03 /tmp
drwxr-xr-x   - hdfs hadoop          0 2019-09-26 14:02 /user
drwxr-xr-x   - hdfs hadoop          0 2019-09-26 14:02 /var