J'écris un travail MapReduce qui peut se retrouver avec un grand nombre de valeurs dans le réducteur. Je suis préoccupé par toutes ces valeurs chargées en mémoire à la fois. P>
Est-ce que la mise en œuvre sous-jacente des valeurs code> valeurs code> code> en mémoire est nécessaire? Hadoop: le guide définitif semble suggérer que c'est le cas, mais ne donne pas une réponse "définitive". P>
La sortie du réducteur sera beaucoup plus massive que la saisie des valeurs, mais je pense que la sortie est écrite sur le disque si nécessaire. P>
3 Réponses :
Vous lisez le livre correctement. Le réducteur ne stocke pas toutes les valeurs en mémoire. Au lieu de cela, lors de la mise en boucle à travers la liste de valeurs iérêleuse, chaque instance d'objet est réutilisée, elle ne conserve donc qu'une seule instance autour à un moment donné.
Par exemple dans le code suivant, l'arraylist Objs aura la taille attendue après la boucle, mais chaque élément sera le même B / C L'instance de texte VAL est réutilisée à chaque itération. P>
This code snippet makes it clear that the same key and value objects are used on each invocation of the map() method -- only their contents are changed (by the reader's next() method). This can be a surprise to users, who might expect keys and vales to be immutable. This causes prolems when a reference to a key or value object is retained outside the map() method, as its value can change without warning. If you need to do this, make a copy of the object you want to hold on to. For example, for a Text object, you can use its copy constructor: new Text(value). The situation is similar with reducers. In this case, the value object in the reducer's iterator are reused, so you need to copy any that you need to retain between calls to the iterator.
Je suis confondu par votre réponse. Vous dites d'abord: «Le réducteur ne stocke pas toutes les valeurs en mémoire», ce qui implique que les matrices de charges valeurs au besoin. Plus tard, vous dites: «Même une seule instance de liste de valeurs pourrait être plus grande que la mémoire», ce qui signifie que la liste des valeurs est d'abord chargée dans la mémoire. Pouvez-vous clarifier s'il vous plait?
Édité pour clarifier. Je veux juste dire même une seule valeur pourrait être grande. Ceci est peu probable. "Le réducteur ne stocke pas toutes les valeurs en mémoire" est une déclaration vraie. Cela a-t-il du sens?
Oui. Merci pour la clarification. Avez-vous une référence pour cela, par hasard?
Très appréciée. Merci.
Ce n'est pas entièrement en mémoire, une partie de celui-ci provient du disque, en regardant le code semble être que le cadre brise le démonteur dans des segments et de les charger de disque dans la mémoire 1 par une. p>
org.apache.haadoop.mapreduce.task.reducecontextextex org.apache.haadoop.mapred.backuptstore p>
Pouvez-vous s'il vous plaît expliquer comment cela résoudra le problème?
comme cité par d'autres utilisateurs, des données entières n'ont pas été chargées dans la mémoire. Regardez certains des paramètres Mapred-Site.xml de Apache lien de documentation.
mapreduce.reduce.shuffle.memory.limit.percent