2013-08-21 1 views
2

j'apprends concept partitionneur now.can quelqu'un me expliquer le morceau ci-dessous de code.it est difficile pour moi de comprendrepartitionneur personnalisé dans la compréhension Hadoop

public class TaggedJoiningPartitioner extends Partitioner<TaggedKey,Text> { 

    @Override 
    public int getPartition(TaggedKey taggedKey, Text text, int numPartitions) { 
     return taggedKey.getJoinKey().hashCode() % numPartitions; 
    } 
} 

comment cette taggedKey.getJoinKey(). hashCode()% numPartitions détermine quel réducteur à exécuter pour une clé?

quelqu'un peut-il m'expliquer cela?

Répondre

5

Ce n'est pas aussi complexe que vous le pensez, une fois que vous avez décomposé les choses un peu.

taggedKey.getJoinKey().hashCode() retournera simplement un nombre entier. Chaque objet aura une fonction hashCode() qui retourne simplement un nombre qui, espérons-le, sera unique à cet objet lui-même. Vous pouvez regarder dans le code source de TaggedKey pour voir comment cela fonctionne si vous le souhaitez, mais tout ce que vous devez savoir, c'est qu'il retourne un entier basé sur le contenu de l'objet.

L'opérateur % effectue la division du module, qui est l'endroit où vous renvoyez le reste après avoir effectué la division. (8% 3 = 2, 15% 7 = 1, etc.). Donc disons que vous avez 3 partitions (numPartitions = 3)

Chaque fois que vous faites la division du module avec 3, vous obtiendrez 0, 1 ou 2, quel que soit le nombre passé. Ceci est utilisé pour déterminer lequel des 3 partitions va obtenir les données. L'idée générale des partitionneurs est que vous pouvez les utiliser pour grouper les données à trier. Si vous vouliez trier par mois, vous pourriez passer chaque morceau de données avec la chaîne "Janvier" à la première partition, "Décembre" au 12ème partitionneur, etc. Mais dans votre cas, il semble un peu confus à l'extérieur. Mais vraiment, ils veulent juste répartir les données de façon égale (espérons-le), donc ils utilisent une simple fonction de hachage/module pour choisir la partition au hasard.

+0

merci beaucoup, après le partitionneur obtient les données, comment il sera transmis aux réducteurs? – user1585111

+2

@ user1585111 Le partitionneur n'obtient pas techniquement les données. Il a une fonction, getPartition, comme vous l'avez posté ci-dessus. Cette fonction est appelée pour indiquer simplement quel est le réducteur dont le mappeur a besoin pour transmettre les données. Si cette réponse est correcte pour vous, vous devriez l'accepter comme correcte :) –

+0

merci, comment le tri est fait ici? – user1585111

Questions connexes