2015-12-09 3 views
1

Je suis à court d'un problème de minute. J'essaie d'obtenir un fichier différent pour différentes clés de Reducer.différentes clés vont dans 1 fichier, même si vous utilisez Hadoop personnalisé Partitioner

Partitioner

public class customPartitioner extends Partitioner<Text, NullWritable> implements 
Configurable { 
private Configuration configuration; 

@Override 
public Configuration getConf() { 
    return configuration; 
} 

public int getPartition(Text key, NullWritable value, int numPartitions) { 
    return Math.abs(key.hashCode()) % numPartitions; 
} 
} 

Et je mets ce qui suit dans ma classe de pilote

job0.setPartitionerClass(customPartitioner.class); 
job0.setNumReduceTasks(5); 

Pour réducteur J'ai 5 clés

[3, 0, 5, 8, 12 ]

J'ai donc besoin de 5 fichiers différents.

Mais une fois que j'ai exécuté ce code, je reçois 5 fichiers de pièces, mais les résultats ne sont pas attendus.

SORTIE

Found 6 items 
-rw-r--r-- 3 sreeveni root   0 2015-12-09 11:44 /OUT/Part/OUT/_SUCCESS 
-rw-r--r-- 3 sreeveni root   0 2015-12-09 11:44 /OUT/Part/OUT/part-r-00000 
-rw-r--r-- 3 sreeveni root   4 2015-12-09 11:44 /OUT/Part/OUT/part-r-00001 
-rw-r--r-- 3 sreeveni root   0 2015-12-09 11:44 /OUT/Part/OUT/part-r-00002 
-rw-r--r-- 3 sreeveni root   4 2015-12-09 11:44 /OUT/Part/OUT/part-r-00003 
-rw-r--r-- 3 sreeveni root   3 2015-12-09 11:44 /OUT/Part/OUT/part-r-00004 

Dans ce 2 fichiers sont vides et l'autre contient

[email protected]:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00001 
3 
8 
[email protected]:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00003 
0 
5 
[email protected]:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00004 
12 

Pourquoi 2 clés sont sous un fichier?

Est-ce que je fais une erreur dans mon code? S'il vous plaît aider

Répondre

3

Votre partitionneur fait la bonne chose, alors je vais essayer d'expliquer pourquoi. Passons chacune de vos entrées dans votre code de partition et voyons ce qui en sort. numPartitions est 5 car c'est le nombre de réducteurs que vous définissez.

int hash = new Text("3").hashCode(); // = 82 
hash % numPartitions; // = 2 

hash = new Text("0").hashCode(); // = 79 
hash % numPartitions; // = 4 

hash = new Text("5").hashCode(); // = 84 
hash % numPartitions; // = 4 

hash = new Text("8").hashCode(); // = 87 
hash % numPartitions; // = 2 

hash = new Text("12").hashCode(); // = 2530 
hash % numPartitions; // = 0 

Comme nous pouvons le voir, nous obtenons les mêmes résultats en l'exécutant manuellement. Deux clés entrent dans un fichier car le partitionneur les affecte au même réducteur. Le partitionnement s'effectue au cours d'un ensemble de données plus important, mais vous ne pouvez pas vous attendre à ce que ce code distribue automatiquement et uniformément toutes les entrées.