【发布时间】:2012-09-27 15:02:26
【问题描述】:
我试图分析默认的 map reduce 作业,它没有定义 mapper 或 reducer。 即使用 IdentityMapper & IdentityReducer 为了让自己清楚,我刚刚写了我的身份缩减器
public static class MyIdentityReducer extends MapReduceBase implements Reducer<Text,Text,Text,Text> {
@Override
public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
while(values.hasNext()) {
Text value = values.next();
output.collect(key, value);
}
}
}
我的输入文件是:
$ hadoop fs -cat NameAddress.txt
Dravid Banglore
Sachin Mumbai
Dhoni Ranchi
Dravid Jaipur
Dhoni Chennai
Sehwag Delhi
Gambhir Delhi
Gambhir Calcutta
I was expecting
Dravid Jaipur
Dhoni Chennai
Gambhir Calcutta
Sachin Mumbai
Sehwag Delhi
I got
$ hadoop fs -cat NameAddress/part-00000
Dhoni Ranchi
Dhoni Chennai
Dravid Banglore
Dravid Jaipur
Gambhir Delhi
Gambhir Calcutta
Sachin Mumbai
Sehwag Delhi
我的观点是,由于聚合是由程序员在 reducer 的 while 循环中完成的,然后写入 outputcollector。我的印象是传递给 outputcollector 的减速器的键总是唯一的,因为如果我不聚合,最后一个键的值会覆盖以前的值。显然不是这样。 有人可以给我一个更好的输出收集器,它是如何工作的以及它如何处理所有的键。我在 hadoop src 代码中看到了许多 outputcollector 的实现。 我可以编写自己的输出收集器来完成我的期望吗?
【问题讨论】:
-
使用身份映射器和身份归约器,并且我假设默认输入格式 (TextInputFormat),您的上述归约器应该会失败,因为 TextInputFormat 输出
<LongWritable, Text>对。您应该以与输入相同的顺序看到输出(假设您当然使用身份映射器、reducers 和 TextInputFormat) -
@Chris-White 是的,我将这些添加到 MyJob job.set("key.value.separator.in.input.line", " "); job.setInputFormat(KeyValueTextInputFormat.class); job.setOutputFormat(TextOutputFormat.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class);
-
reduce 的输出没有限制,因此它没有义务生成具有唯一键的记录。因此 outputcollector 不应该检查密钥,将其视为 System.out.println 的一个版本。
标签: hadoop mapreduce reduce partitioner