Je souhaite résoudre l’exception « java.lang.OutOfMemoryError: GC overhead limit exceeded. » dans Amazon EMR.
Brève description
Le service NameNode utilise la mémoire pour stocker les objets d'espace de noms et les métadonnées des fichiers stockés dans le système de fichiers distribué Hadoop (HDFS). Plus vous avez de fichiers dans HDFS, plus NameNode utilise de mémoire.
Lorsque la taille du tas NameNode est insuffisante par rapport à la quantité de données HDFS du cluster, vous recevez l’erreur « java.lang.OutOfMemoryError » : GC overhead limit exceeded ». Pour éviter les exceptions de mémoire insuffisante, augmentez la taille du tas.
Résolution
Vérifier les journaux pour confirmer l'erreur
Procédez comme suit :
-
Utilisez SSH pour vous connecter au nœud primaire.
-
Pour vérifier l'état du service NameNode, exécutez la commande suivante sur le nœud primaire :
initctl list
Lorsque le service NameNode s'arrête, vous recevez la sortie suivante :
hadoop-hdfs-namenode stop/waiting
-
Pour confirmer l'exception OutofMemory, consultez le journal NameNode à l'adresse /var/log/hadoop-hdfs/hadoop-hdfs-namenode-ip-####.out.
Remarque : Remplacez #### par l'adresse IP privée du nœud primaire.
Lorsque le service NameNode échoue en raison d'une exception OutOfMemory, vous recevez une sortie similaire à l'exemple suivant :
# 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 requiert le redémarrage du service NameNode. Assurez-vous qu'aucune application n'effectue d'opérations de lecture ou d'écriture HDFS lorsque vous augmentez la taille du tas NameNode.
Amazon EMR versions 5.21.0 et ultérieures
Pour augmenter la taille du tas, fournissez un objet de configuration hadoop-env pour le groupe d'instances d'un cluster en cours d'exécution. Vous pouvez également ajouter l'objet de configuration lorsque vous lancez un nouveau cluster. Choisissez une taille adaptée à votre charge de travail.
L'exemple d'objet de configuration suivant augmente la taille du tas de 1 Go à 2 Go :
[
{
"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.
Amazon EMR versions 5.20.0 et antérieures
Procédez comme suit :
-
Utilisez SSH pour vous connecter au nœud primaire.
-
Dans le fichier /etc/hadoop/conf/hadoop-env.sh, augmentez la taille du tas NameNode :
export HADOOP_NAMENODE_HEAPSIZE=2048
Remarque : Remplacez 2048 par la taille de tas requise.
-
Enregistrez vos modifications.
-
Pour redémarrer le service NameNode, exécutez les commandes suivantes :
sudo stop hadoop-hdfs-namenode; sudo start hadoop-hdfs-namenode
-
Pour vérifier que le processus NameNode est en cours d'exécution, exécutez la commande suivante :
initctl list
Sortie attendue :
hadoop-hdfs-namenode start/running, process 6324
-
Pour vérifier que les commandes HDFS fonctionnent, exécutez la commande suivante :
hdfs dfs -ls /
Sortie attendue :
Found 4 itemsdrwxr-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
-
Surveillez le cluster après avoir modifié la configuration.
Informations connexes
Configurer les applications
Comment résoudre les exceptions d'espace de tas Java Hive « OutOfMemoryError » sur Amazon EMR qui se produisent lorsque Hive affiche les résultats de la requête ?