【问题标题】:When Exactly Combiner is called in MapReduce?什么时候在 MapReduce 中调用 Exactly Combiner?
【发布时间】:2017-10-07 02:42:45
【问题描述】:

Combiners 使用与 reducer 相同的类和大部分相同的代码。 但是问题是什么时候在 sort 和 shuffle 之前或在 reduce 之前调用它? 如果在排序和洗牌之前我。例如,就在映射器之后,它将如何以[key, list<values>] 获得输入?因为这是通过排序和洗牌给出的。 现在,如果它在 sort 和 shuffle i 之后被调用。例如,就在减速器之前,然后输出到组合器是[key, value],就像减速器一样,那么减速器将如何获得输入为[key, list<values>]

【问题讨论】:

标签: hadoop mapreduce combiners


【解决方案1】:

组合器的输出类型必须匹配映射器的输出类型。 Hadoop 不保证组合器应用了多少次,甚至根本不应用它。

如果您的 mapper 扩展 Mapper< K1, V1, K2, V2 > 并且您的 reducer 扩展
Reducer< K2, V2, K3, V3 >,那么组合器必须是
Reducer< K2, V2, K2, V2 > 的扩展。

Combinermap 操作在同一台机器上应用。绝对是在洗牌之前。

参考 Hadoop 文档:

当映射操作输出它的对时,它们已经在内存中可用。出于效率原因,有时通过提供组合器类来执行缩减类型函数来利用这一事实是有意义的。如果使用组合器,则映射键值对不会立即写入输出。相反,它们将被收集在列表中,每个键值一个列表。当写入了一定数量的键值对时,通过将每个键的所有值传递给组合器的 reduce 方法并输出组合操作的键值对,就好像它们是由原始映射创建的一样,刷新这个缓冲区手术。

http://wiki.apache.org/hadoop/HadoopMapReduce

【讨论】:

  • 如果它在 shuffle 之前运行,那么这意味着它从 mapper 获取输入,但组合器的输入是 key,list 并且这种类型的输出来自排序和 shuffle 阶段,那么它如何在排序之前运行并随机播放。
  • 我稍微澄清了我的答案。请看一看。
【解决方案2】:

Combiner 就像一个 pre-reducer,它会在 map 阶段之后不久在 sort 和 shuffle 阶段之前应用。

它将应用于处理 map 阶段的同一主机上,从而最大限度地减少网络上的数据传输以进行下一阶段的处理(排序-shuffle 和 reduce)。

由于使用combiner的这种优化,实际reducer阶段的处理负担会更小,性能会更好。

【讨论】:

  • 是的,这是组合器的功能,它是正确的,但我的问题是它在 mapper、s&s 和 reducer 的管道中的确切位置。
  • 实际上是在 map 阶段之后和 sort 和 shuffle 之前。在 map 阶段之后,输出将流水线用于下一个排序和混洗阶段,Combiner 在该排序和混洗阶段之前起作用。就像,Map->Combiner->Sort n Shuffle -> Reducer
【解决方案3】:

实际上是在 map 阶段之后和排序和洗牌之前。在 map 阶段之后,输出将流水线用于下一个排序和混洗阶段,Combiner 在该排序和混洗阶段之前起作用。就像,Map->Combiner->Sort n Shuffle -> Reducer

【讨论】:

  • 对不起,我不这么认为,我认为顺序是“映射 -> 内存中的缓冲区 -> 分区 -> 排序 -> 组合器 -> 溢出到磁盘 -> 减少"
【解决方案4】:

即使您编写了自定义组合器,Map Reduce 框架也不会一直调用组合器。如果溢出次数至少为 3(默认),它肯定会调用组合器。您可以配置,可以通过min.num.splits.for.combine 属性设置组合器需要运行的溢出次数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2012-04-30
    • 2019-12-25
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多