2015-09-10 2 views
0

Tout en travaillant sur la question de tri secondaire du guide définitif, je suis tombé sur un code comme ceci:Expliquer Hadoop Partitioner

@Override 
public int getPartition(TextpairWritable tp, IntWritable value, int numPartitions) { 

    return Math.abs(Integer.parseInt(tp.getyear().toString()) * 127) % numPartitions; 
} 

Je veux comprendre quel est le sens de la ligne:

return Math.abs(Integer.parseInt(tp.getyear().toString()) * 127) % numPartitions; 

Si je ne dis pas le nombre de réducteurs dans le code du pilote, comment hadoop connait-il la valeur de ce paramètre dans la ligne ci-dessus. quelle est la signification de le multiplier par 127?

Répondre

0

Renvoyer Math.abs (Integer.parseInt (tp.getyear(). ToString()) * 127) numPartitions;

Vous pouvez considérer cela comme un hachage, sur la base de votre valeur d'attribut key's year. Vous pouvez choisir n'importe quel nombre (prime) pour la multiplication avec la valeur que vous obtenez. Ici, la valeur choisie est 127. La dernière partie, numPartitions, définit le nombre de compartiments (réducteurs) à diviser. Si je ne précise pas le nombre de réducteurs dans le code du pilote, comment hadoop connaît-il la valeur de ce paramètre dans la ligne ci-dessus? La valeur par défaut pour le paramètre est 1. Donc toutes les données (sortie des mappeurs) vont à la même tâche de réduction.

quelle est la signification de la multiplier par 127?

C'est un nombre premier. Nous multiplions habituellement par le nombre premier de sorte que vous puissiez manipuler/ignorer le shew-ness des données. Les nombres premiers ne sont divisibles par aucun autre nombre, ils aident donc à répartir les données uniformément sur toute la gamme.

+1

Il y a un cas bizarre en Java lorsque Math.abs renvoie un nombre négatif, par exemple Math.abs (Integer.MIN_VALUE)% 3 <0 et la partition ne peut pas être négative. Il est beaucoup plus sûr d'abs après mod: return Math.abs (Integer.parseInt (tp.getyear(). ToString()) * 127% numPartitions); – alexeipab

+0

Vous avez absolument raison. Je n'étais pas au courant du fait, 'Math.abs()', si l'argument est égal à la valeur de 'Integer.MIN_VALUE', la valeur int représentable la plus négative, le résultat est la même valeur, qui est négative. – YoungHobbit

+0

Est-ce que les autres choses à propos de partitionner personnalisé sont maintenant claires pour vous grâce à la réponse? – YoungHobbit