Erreur de mémoire insuffisante dans la phase de mélange de Mapreduce
J'obtiens des erreurs étranges lors de l'exécution d'un nombre de mots-comme mapreduce programme. J'ai un cluster hadoop avec 20 esclaves, chacun ayant 4 GO de RAM. J'ai configuré ma carte tâches d'avoir un tas de 300 MO et ma réduire la tâche des fentes obtenir 1 GO. J'ai 2 emplacements de carte et 1 réduire la fente par nœud. Tout va bien jusqu'à ce que le premier tour de la carte tâches finitions. Ensuite, il reste des progrès à 100%. Je suppose alors la phase de copie. Chaque carte tâche génère quelque chose comme:
Map output bytes 4,164,335,564
Map output materialized bytes 608,800,675
(Je suis en utilisant SnappyCodec pour la compression)
Après caler pendant environ une heure, l'réduire les tâches de crach avec l'exception suivante:
Error: java.lang.OutOfMemoryError: Java heap space at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1703) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1563) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1401) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1333
J'ai été sur google et j'ai trouvé ce lien, mais je ne sais pas vraiment quoi faire de lui:
hadoop lien commun
Je ne comprends pas pourquoi hadoop l'expérience de tous les problèmes de reproduction et de fusion si elle est capable de réaliser un terasort de référence. Il ne peut être que tous les carte de sortie devrait s'inscrire dans la mémoire RAM de l'réducteur de filetage. Donc ce qui se passe ici?
Dans le lien fourni ci-dessus, ils ont une discussion sur le réglage des paramètres suivants:
mapreduce.reduce.shuffle.input.buffer.percent = 0.7
mapreduce.reduce.shuffle.memory.limit.percent = 0.25
mapreduce.reduce.shuffle.parallelcopies = 5
Ils affirment que le fait que le produit des paramètres >1 permet heapsize erreurs.
EDIT: Note que 5*1.25*0.7 est encore <1 la mise au point de l'om, mon deuxième solution post!)
Avant de redémarrer cette simulation intensive, je serais très heureux de connaître l'opinion de quelqu'un concernant le problème, je suis confronté à, car il est la peine depuis presque une semaine maintenant. J'ai aussi semblent pas complètement comprendre ce qui se passe dans cette phase de copie, je m'attends à une fusion de tri sur le disque pas besoin de beaucoup de taille de segment de mémoire?
Merci beaucoup à l'avance pour les commentaires et les réponses!
source d'informationauteur DDW
Vous devez vous connecter pour publier un commentaire.
Je pense que l'idée est que le heapsize de ma réduire la tâche était nécessaire presque complètement pour le réduire phase. Mais le shuffle phase est en compétition pour le même heapspacele conflit qui a surgi à cause de mon emploi à l'écrasement. Je pense que c'est ce qui explique pourquoi le travail ne se bloque plus si je baisse le
shuffle.input.buffer.percent
.Le paramètre que vous citez
mapred.job.shuffle.input.buffer.percent
est apparemment un pré Hadoop 2 paramètre. J'ai pu trouver ce paramètre dans le mapred-default.xml par la 1.04 docs mais son nom a été changé pour lamapreduce.reduce.shuffle.input.buffer.percent
par la 2.2.0 docs.Par les docs de ce paramètre description est:
Pour une compréhension complète de Tri et Shuffle voir Le chapitre 6.4 de L'Hadoop Guide Définitif. Ce livre propose une autre définition du paramètre
mapred.job.shuffle.input.buffer.percent
:Depuis que vous avez observé que la diminution de la valeur de
mapred.job.shuffle.input.buffer.percent
de défaut de0.7
à0.2
résolu votre problème, il est assez sûr de dire que vous pourriez avoir également permis de résoudre votre problème en augmentant la valeur de la pièce de réduction de la taille de segment de mémoire.Même après la modification de la
shuffle.input.buffer.percent
à 0,2 elle ne fonctionne pas pour moi et j'ai obtenu le même message d'erreur.Après avoir fait frapper et d'essai sur un seul nœud de cluster, j'ai trouvé qu'il doit y avoir suffisamment d'espace dans
/
répertoire que le processus utilise que l'espace en cas de déversement.Le déversement répertoire doit également être modifié.
Liées bug - https://issues.apache.org/jira/browse/MAPREDUCE-6724
Peut causer une NegativeArraySizeException si le calcul de l'maxSingleShuffleLimit > MAX_INT