9 votes

Hadoop : Comment fonctionne OutputCollector pendant MapReduce ?

Je veux savoir si la sortie de l'OutputCollector utilisée dans la fonction map: output.collect(key, value) est stockée quelque part - cette sortie devrait-elle enregistrer les paires clé-valeur quelque part? même si elle est émise vers la fonction reducer, il doit y avoir un fichier intermédiaire, non? Quels sont ces fichiers? Sont-ils visibles et décidés par le programmeur? Est-ce que les classes OutputKeyClass et OutputValueClass que nous spécifions dans la fonction principale sont ces lieux de stockage? [Text.class et IntWritable.class]

Je donne le code standard de l'exemple de comptage des mots en MapReduce, que l'on peut trouver à de nombreux endroits sur le net.

public class WordCount {

public static class Map extends MapReduceBase implements Mapper {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}

public static class Reduce extends MapReduceBase implements Reducer {
public void reduce(Text key, Iterator values, OutputCollector output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}

public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");

conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);

conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);

FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));    
JobClient.runJob(conf);
}
}

4voto

Chaos Points 2422

La sortie de la fonction Map est stockée dans des fichiers temporaires intermédiaires. Ces fichiers sont gérés de manière transparente par Hadoop, donc dans un scénario normal, le programmeur n'y a pas accès. Si vous êtes curieux de ce qui se passe à l'intérieur de chaque mappage, vous pouvez consulter les journaux pour le travail correspondant où vous trouverez un fichier journal pour chaque tâche de mappage.

Si vous souhaitez contrôler l'endroit où les fichiers temporaires sont générés et y accéder, vous devez créer votre propre classe OutputCollector, et je ne sais pas à quel point cela est facile.

Si vous voulez jeter un coup d'œil au code source, vous pouvez utiliser svn pour l'obtenir. Je pense qu'il est disponible ici : http://hadoop.apache.org/common/version_control.html.

2voto

Ulises Points 4893

Je crois qu'ils sont stockés dans des emplacements temporaires et ne sont pas disponibles pour le développeur, à moins que vous ne créiez votre propre classe qui implémente OutputCollector.

Je devais accéder à ces fichiers et j'ai résolu le problème en créant des fichiers secondaires: http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html#Task+Side-Effect+Files

0voto

Les sorties intermédiaires regroupées sont toujours stockées dans des SequenceFiles. Les applications peuvent spécifier si et comment les sorties intermédiaires doivent être compressées et quels CompressionCodecs doivent être utilisés via le JobConf.

http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/Mapper.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X