MapReduce什么时候调用Exactly Combiner?

When Exactly Combiner is called in MapReduce?

Combiners 使用与 reducer 相同的 class 和大部分相同的代码。 但是问题是什么时候在 sort 和 shuffle 之前或 reduce 之前调用它? 如果在排序和洗牌之前 i.即,在 mapper 之后如何将输入作为 [key, list<values>]?因为这是由排序和随机播放给出的。 现在,如果它在 sort and shuffle i 之后被调用。即,就在 reducer 之前,然后输出到组合器是 [key, value] 就像 reducer 那么 reducer 如何将输入作为 [key, list<values>]?

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

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

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

如 Hadoop 文档所述:

When the map operation outputs its pairs they are already available in memory. For efficiency reasons, sometimes it makes sense to take advantage of this fact by supplying a combiner class to perform a reduce-type function. If a combiner is used then the map key-value pairs are not immediately written to the output. Instead they will be collected in lists, one list per each key value. When a certain number of key-value pairs have been written, this buffer is flushed by passing all the values of each key to the combiner's reduce method and outputting the key-value pairs of the combine operation as if they were created by the original map operation.

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

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

它将应用于处理映射阶段的同一台主机,从而最大限度地减少下一阶段处理(排序-洗牌和减少)的跨网络数据传输。

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

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

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