2012-06-12 20 views
9

Desidero sapere se l'output di "istanza" di OutputCollector utilizzato nella funzione mappa: output.collect (chiave, valore) questo -output- sta memorizzando le coppie di valori chiave da qualche parte? anche se emette la funzione di riduzione, il loro deve essere un file intermedio, giusto? Cosa sono quei file? Sono visibili e decisi dal programmatore? Le uscite OutputKeyClass e OutputValueClasses che specifichiamo nella funzione principale in questi luoghi di archiviazione? [Text.class e IntWritable.class]Hadoop: come funziona OutputCollector durante MapReduce?

Im dando il codice standard per l'esempio di conteggio parole in MapReduce, che possiamo trovare in molti punti della rete.

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

Perché si desidera accedere a questi file temporanei? Hai una cosa particolare che vuoi raggiungere? o è solo la curiosità? – adranale

+0

Voglio cambiare la posizione di questi file temporanei. – catty

risposta

3

L'uscita dalla funzione cartografici sono memorizzati in file temporaneo intermedio. Questi file sono gestiti in modo trasparente da Hadoop, quindi in un normale scenario, il programmatore non ha accesso a questo. Se sei curioso di sapere cosa sta succedendo all'interno di ogni mapper, puoi rivedere i log per il rispettivo lavoro in cui troverai un file di registro per ciascuna attività della mappa.

Se si desidera controllare dove vengono generati i file temporanei e averne accesso, è necessario creare la propria classe OutputCollector e non so quanto sia facile.

Se si vuole dare un'occhiata al codice sorgente, è possibile utilizzare svn per ottenerlo. Penso che sia disponibile qui: http://hadoop.apache.org/common/version_control.html.

Problemi correlati