membre - parcourir un tableau java



Émettre l'itération sur le composant inscriptible personnalisé dans le réducteur (1)

J'utilise une classe inscriptible personnalisée comme VALUEOUT dans la phase de la carte dans mon travail MR où la classe a deux champs, A org.apache.hadoop.io.Text et org.apache.hadoop.io.MapWritable . Dans ma fonction de réduction, je parcoure les valeurs de chaque clé et j'effectue deux opérations: 1. filtrer, 2. agréger. Dans le filtre, j'ai quelques règles pour vérifier si certaines valeurs dans le MapWritable (avec la clé comme Text et la valeur comme IntWritable ou DoubleWritable ) satisfont certaines conditions et puis je les ajoute simplement à un ArrayList. À la fin de l'opération de filtrage, j'ai une liste filtrée de mes objets inscriptibles personnalisés. Lors de la phase d'agrégation, lorsque j'accède aux objets, il s'avère que le dernier objet qui a été filtré avec succès a écrasé tous les autres objets de l'arborescence. Après avoir rencontré des problèmes similaires avec des listes sur SO où le dernier objet écrase tous les autres, j'ai confirmé que je n'ai pas de champs statiques et que je ne réutilise pas la même écriture personnalisée en définissant des valeurs différentes (qui ont été citées un problème). Pour chaque touche du réducteur, j'ai CustomWritable que les CustomWritable , Text key et MapWritable sont de nouveaux objets.

En outre, j'ai également effectué un test simple en éliminant les opérations de filtrage et d'agrégat dans mon réduire et juste itéré à travers les valeurs et les ajouté à un ArrayList en utilisant une boucle for. Dans la boucle, chaque fois que j'ai ajouté un CustomWritable dans la liste, j'ai enregistré les valeurs de tout le contenu de la liste. Je me suis connecté avant et après avoir ajouté l'élément à la liste. Les deux journaux présentaient que l'ensemble d'éléments précédent avait été écrasé. Je suis confus sur la façon dont cela pourrait même arriver. Dès que l'élément suivant de l'itérable de valeurs a été accédé par la boucle for ( CustomWritable result : values ) , le contenu de la liste a été modifié. Je suis incapable de comprendre la raison de ce comportement. Si quelqu'un peut faire la lumière sur ce sujet, ce serait vraiment utile. Merci.


L'itérateur "values" du réducteur réutilise la valeur lors de l'itération. C'est une technique utilisée pour la performance et une plus petite empreinte mémoire. Dans les coulisses, Hadoop désérialise l'enregistrement suivant dans le même objet Java. Si vous devez "vous souvenir" d'un objet, vous devrez le cloner.

Vous pouvez tirer parti de l'interface Writable et utiliser les octets bruts pour remplir un nouvel objet.

IntWritable first = WritableUtils.clone(values.next(), context.getConfiguration());
IntWritable second = WritableUtils.clone(values.next(), context.getConfiguration());




iterable