Je voudrais savoir pourquoi le comparateur de regroupement est utilisé dans le type secondaire de mapreduce.
Selon l'exemple guide définitif du tri secondaire
Nous voulons que l'ordre de tri des clés soit par année (ascendant) puis par température (descendant):
1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C
En définissant un partitionneur pour partitionner par la partie année de la clé, nous pouvons garantir que les enregistrements pour la même année vont au même réducteur. Cependant, cela ne suffit pas pour atteindre notre objectif. Un partitionneur garantit qu'un seul réducteur reçoit tous les enregistrements pendant un an; cela ne change pas le fait que le réducteur regroupe par clé dans la partition.
Puisque nous aurions déjà écrit notre propre partitionneur qui prendrait en charge les clés de sortie de la carte allant vers un réducteur particulier, alors pourquoi devrions-nous le regrouper.
Merci d'avance
À l'appui de la réponse choisie, j'ajoute:
Dans la continuité de cette explication
**Input**:
symbol time price
a 1 10
a 2 20
b 3 30
**Map output**: create composite key\values like so:
> symbol-time time-price
>
>**a-1** 1-10
>
>**a-2** 2-20
>
>**b-3** 3-30
Le partitionneur : acheminera les touches a-1 et a-2 vers le même réducteur malgré le fait que les touches soient différentes. Il acheminera également le b-3 vers un réducteur séparé.
GroupComparator : une fois que la clé\valeur composite arrive au réducteur au lieu que le réducteur obtienne
>(**a-1**,{1-10})
>
>(**a-2**,{2-20})
ce qui précède se produira en raison des valeurs clés uniques suivant la composition.
le comparateur de groupe s'assurera que le réducteur obtient:
(a-1,{**1-10,2-20**})
La clé des valeurs groupées sera celle qui arrive en premier dans le groupe. Ceci peut être contrôlé par le comparateur clé.
**[[In a single reduce method call.]]**
Permettez-moi d'améliorer la déclaration "... prenez soin des clés de sortie de la carte qui vont à un réducteur particulier".
Instance de réducteur vs méthode de réduction: une JVM est créée par tâche de réduction et chacune d'elles a une seule instance de la classe de réducteur. Il s'agit de l'instance de réducteur (je l'appelle à partir de maintenant) .Dans chaque réducteur, la méthode de réduction est appelée plusieurs fois en fonction de sur `` regroupement de clés ''. Chaque réduction de temps est appelée, `` valuein '' a une liste de valeurs de sortie de carte regroupées par la clé que vous définissez dans `` comparateur de regroupement '' .Par défaut, le comparateur de regroupement utilise la clé de sortie de carte entière.
Dans l'exemple, la clé de sortie de la carte est remplacée par `` année et température '' pour effectuer le tri.Si vous ne définissez pas un comparateur de regroupement qui utilise uniquement la partie `` année '' de la clé de sortie de la carte, vous ne pouvez pas enregistrer tous les enregistrements de la même année. aller au même appel de méthode de réduction.
Vous devez introduire une clé intermédiaire qui est un composite de l'année et de la température; partition sur la clé naturelle (l'année) et introduire un comparateur qui triera sur la clé composite entière. Vous avez raison: en partitionnant l'année, vous obtiendrez toutes les données d'une année dans le même réducteur, de sorte que le comparateur triera efficacement les données de chaque année en fonction de la température.
Le partitionneur par défaut calcule le hachage de la clé, et les clés qui ont la même valeur de hachage seront envoyées au même réducteur. Si vous avez une clé composite (naturelle + augmentée) émise dans votre mappeur et si vous voulez envoyer les clés qui ont la même clé naturelle au même réducteur, vous devez implémenter un partitionneur personnalisé.
public class SimplePartitioner implements Partitioner {
@Override
public int getPartition(Text compositeKey, LongWritable value, int numReduceTasks) {
//Split the key into natural and augment
String naturalKey = compositeKey.toString().split("separator")
return naturalKey.hashCode();
}
}
Et maintenant, si vous voulez que tous vos les lignes pertinentes d'une partition de données soient envoyées à un seul réducteur vous devez également implémenter un comparateur de regroupement qui ne considère que la clé naturelle
public class SimpleGroupingComparator extends WritableComparator {
@Override
public int compare(Text compositeKey1, Text compositeKey2) {
return compare(compositeKey1.getNaturalKey(),compositeKey2.getNaturalKey());
}
}