2012-06-12 20 views
9

Ich möchte wissen, ob die 'Instanz'-Ausgabe des OutputCollectors in der Map-Funktion verwendet wird: output.collect (Schlüssel, Wert) this -output- Werden die Schlüsselwertpaare irgendwo gespeichert? auch wenn es an die Reducer-Funktion ausgibt, müssen sie eine Zwischendatei sein, oder? Was sind diese Dateien? Sind sie vom Programmierer sichtbar und entschieden? Sind die OutputKeyClass und OutputValueClasses, die wir in der Hauptfunktion angeben, diese Speicherorte? [Text.class und IntWritable.class]Hadoop: Wie funktioniert OutputCollector während MapReduce?

Ich gebe den Standardcode für Word Count Beispiel in MapReduce, die wir an vielen Stellen im Netz finden können.

public class WordCount { 

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

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> 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<Text, IntWritable, Text, IntWritable> { 
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> 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); 
} 
} 
+0

Warum möchten Sie auf diese temporären Dateien zugreifen? Haben Sie eine bestimmte Sache, die Sie erreichen möchten? oder ist es nur Kuriosität? – adranale

+0

Ich möchte den Speicherort dieser temporären Dateien ändern. – catty

Antwort

3

Die Ausgabe von der Map-Funktion in Temporäre Zwischendateien gespeichert ist. Diese Dateien werden von Hadoop transparent behandelt. In einem normalen Szenario hat der Programmierer keinen Zugriff darauf. Wenn Sie wissen möchten, was in den einzelnen Mappern passiert, können Sie die Protokolle für den jeweiligen Job überprüfen, in denen Sie eine Protokolldatei für jede Map-Aufgabe finden.

Wenn Sie steuern möchten, wo die temporären Dateien generiert werden und Zugriff darauf haben, müssen Sie Ihre eigene OutputCollector-Klasse erstellen, und ich weiß nicht, wie einfach das ist.

Wenn Sie sich den Quellcode ansehen möchten, können Sie svn verwenden, um es zu bekommen. Ich denke, es ist hier verfügbar: http://hadoop.apache.org/common/version_control.html.