9

我想知道 Map 函数中使用的 OutputCollector 的“实例”输出: output.collect(key, value) this -output- 是否将键值对存储在某处?即使它发送到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);
}
}
4

3 回答 3

4

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

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

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

于 2012-06-14T05:21:01.917 回答
2

我相信它们存储在临时位置并且对开发人员不可用,除非您创建自己的实现OutputCollector.

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

于 2012-06-12T12:55:03.133 回答
0

The intermediate, grouped outputs are always stored in SequenceFiles. Applications can specify if and how the intermediate outputs are to be compressed and which CompressionCodecs are to be used via the JobConf.

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

于 2013-09-25T10:31:12.473 回答