Hadoop:在MapReduce期间OutputCollector如何工作?

时间:2012-06-12 12:46:53

标签: java hadoop mapreduce

我想知道OutputCollector'实例' map函数中使用的输出: output.collect(键,值) 这个 - 输出 - 在某处存储键值对? 即使它发送到reducer函数,它们也必须是一个中间文件,对吧? 那些文件是什么?它们是否可见并由程序员决定? 我们在main函数中指定的OutputKeyClass和OutputValueClasses这些存储位置是什么? [Text.class和IntWritable.class]

我在MapReduce中给出了Word Count示例的标准代码,我们可以在网络的很多地方找到它。

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);
}
}

3 个答案:

答案 0 :(得分:3)

Map函数的输出存储在Temporary Intermediate Files中。这些文件由Hadoop透明处理,因此在正常情况下,程序员无权访问。如果您对每个映射器中发生的情况感到好奇,可以查看相应作业的日志,您可以在其中找到每个映射任务的日志文件。

如果你想控制临时文件的生成位置并且可以访问它们,你必须创建自己的OutputCollector类,我不知道它有多容易。

如果您想查看源代码,可以使用svn来获取它。我认为可以在这里找到:http://hadoop.apache.org/common/version_control.html

答案 1 :(得分:2)

我认为它们存储在临时位置并且不可供开发人员使用,除非您创建自己的类来实现OutputCollector

我曾经不得不访问这些文件并通过创建副作用文件来解决问题: http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html#Task+Side-Effect+Files

答案 2 :(得分:0)

中间的分组输出始终存储在SequenceFiles中。应用程序可以指定是否以及如何压缩中间输出以及通过JobConf使用哪些CompressionCodecs。

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