outputcollector如何工作?

时间:2012-10-06 20:17:36

标签: hadoop mapreduce reduce partitioner

我试图分析默认的地图缩减作业,它没有定义映射器或缩减器。 即使用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的减速器的键始终是唯一的&amp;因为如果我不进行聚合,最后一个键的值将覆盖之前的值。显然情况并非如此。 有人可以给我一个更好的输出收集器,它如何工作以及它如何处理所有键。我在hadoop src代码中看到了很多outputcollector的实现。 我可以编写自己的outputcollector,可以做我期待的事情吗?

1 个答案:

答案 0 :(得分:1)

对于reducer,键是唯一的,每次对reducer的调用都有一个唯一的键值,并且是与该键相关的所有值的可迭代值。你正在做的是迭代传入的所有值并写出每个值。

因此,在您的情况下,调用数量可能少于数据并不重要。你仍然最终写出所有的价值。