【问题标题】:How outputcollector works?输出收集器如何工作?
【发布时间】: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 输出 &lt;LongWritable, Text&gt; 对。您应该以与输入相同的顺序看到输出(假设您当然使用身份映射器、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


【解决方案1】:

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

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

【讨论】:

  • 更正了我的问题,reducer 键始终是唯一的并且包含值列表。我想知道什么时候所有这些都写为输出收集器的键、值,那么输出收集器不检查唯一性吗?是否有一个输出收集器来检查它。以及如何为我的 mapreduce 作业选择特定的输出收集器
  • 如果你想要唯一性,你需要在你的 reducer 中实现它——无论你想要第一个/最后一个/最小/最大等——这就是你要实现的
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 2020-01-25
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多