2012-06-12 13 views
9

Chcę wiedzieć, czy wyjście "instancji" OutputCollector używane w funkcji mapy: output.collect (klucz, wartość) to -output- przechowywać gdzieś pary klucz-wartość? nawet jeśli emituje do funkcji reduktora, ich plik musi być plikiem pośrednim, prawda? Co to za pliki? Czy są one widoczne i postanowione przez programistę? Czy klasy OutputKeyClass i OutputValueClasses, które określamy w głównej funkcji tych miejsc pamięci? [Text.class i IntWritable.class]Hadoop: Jak działa OutputCollector podczas MapReduce?

Im daje standardowy kod dla przykładu Word Count w MapReduce, który możemy znaleźć w wielu miejscach w sieci.

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

Dlaczego chcesz uzyskać dostęp do tych plików tymczasowych? Czy masz coś wyjątkowego, co chcesz osiągnąć? czy to tylko curisoity? – adranale

+0

Chcę zmienić lokalizację tych plików tymczasowych. – catty

Odpowiedz

3

Wyjście z funkcji map są zapisane w Tymczasowe pliki Pośredniczącą. Pliki te są obsługiwane przez Hadoop w sposób przezroczysty, więc w normalnym scenariuszu programista nie ma do tego dostępu. Jeśli jesteś ciekawy, co dzieje się w każdym programie odwzorowującym, możesz przejrzeć dzienniki dla odpowiednich zadań, gdzie znajdziesz plik dziennika dla każdego zadania mapy.

Jeśli chcesz kontrolować, gdzie są generowane pliki tymczasowe i mieć do nich dostęp, musisz utworzyć własną klasę OutputCollector i nie wiem, jakie to łatwe.

Jeśli chcesz rzucić okiem na kod źródłowy, możesz użyć svn, aby go uzyskać. Myślę, że jest dostępny tutaj: http://hadoop.apache.org/common/version_control.html.

Powiązane problemy