【问题标题】:How to implement the combiner in Hadoop MapReduce?如何在 Hadoop MapReduce 中实现组合器?
【发布时间】:2014-03-13 12:58:15
【问题描述】:

我了解,为了在 Hadoop MapReduce 中包含组合器,包含以下行(我已经完成了);

   conf.setCombinerClass(MyReducer.class);

我不明白的是,我在哪里实际实现了组合器的功能。我是否在 MyReducer 下创建 combine{} 方法?比如reduce方法;

  public void reduce(Text key, Iterator<IntWritable> values,
  OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { }

非常感谢!

【问题讨论】:

    标签: java hadoop mapreduce elastic-map-reduce


    【解决方案1】:

    Combiner 应该只是一个Reducer,因此实现Reducer 接口(没有Combiner 接口)。将合并步骤视为MapperReducer 之间的一种中间减少步骤。

    以字数为例。来自Yahoo's tutorial

    字数是组合器有用的一个主要例子。清单 1--3 中的 Word Count 程序为它看到的每个单词的每个实例发出一个 (word, 1) 对。因此,如果同一个文档包含 3 次“cat”一词,则发出 3 次 (“cat”, 1) 对;然后所有这些都被发送到Reducer。通过使用Combiner,这些可以被压缩成单个(“cat”,3)对发送到Reducer。现在每个节点只为每个单词向 reducer 发送一个值——大大减少了 shuffle 过程所需的总带宽,并加快了工作速度。最好的部分是我们不需要编写任何额外的代码来利用这一点!如果 reduce 函数既可交换又可关联,那么它也可以用作 Combiner。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      考虑到你的 sn-p,你只需要像往常一样实现你的 reduce() 方法,这里没有什么特别的。但是,请记住,组合器功能是一种优化。这意味着 Hadoop 不保证它会为特定的地图输出调用多少次。它可能根本不会调用它。

      如果你查看Hadoop Reducer 类的API,你会发现reduce() 方法。没有 combine() 或任何其他方法可以覆盖。

      【讨论】:

      • 我刚刚意识到我已经问过如何“实现减速器的功能”而不是“组合器”,很抱歉它现在已修复。能再回答一下吗?
      • @ali 取决于您的情况和您的数据。不能说
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2015-10-29
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2014-03-07
      相关资源
      最近更新 更多