在MapReduce中调用Exactly Combiner时?

时间:2015-07-07 05:45:20

标签: hadoop mapreduce combiners

组合器使用与reducer相同的类,并且大多数使用相同的代码。 但是问题是在排序和洗牌之前或者在减少之前调用它的确切时间? 如果在排序和洗牌之前我。例如,在mapper之后,它将如何作为[key, list<values>]获得输入?因为这是通过排序和洗牌给出的。 现在如果在排序和洗牌之后调用它我。例如,在reducer之前然后输出到combiner的是[key, value],就像reducer一样,那么reducer将如何输入[key, list<values>]

4 个答案:

答案 0 :(得分:1)

Combiner就像一个预缩减器,它将在排序和随机播放阶段之前的地图阶段之后很快应用。

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

由于使用组合器的这种优化,实际的减速器阶段将具有较少的处理负担,从而产生更好的性能。

答案 1 :(得分:1)

实际上,在地图阶段之后和排序和随机播放之前。在映射阶段之后,输出将被流水线化以用于下一个排序和洗牌阶段,Combiner在该排序和洗牌阶段之前起作用。它就像Map-&gt; Combiner-&gt; Sort n Shuffle - &gt;减速机

答案 2 :(得分:0)

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

如果您的映射器延伸Mapper< K1, V1, K2, V2 >且缩减器延伸为Reducer< K2, V2, K3, V3 >,则组合器必须是Reducer< K2, V2, K2, V2 >的扩展名。

Combinermap操作应用于同一台计算机。绝对是在洗牌之前。

如Hadoop文档所述:

  

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

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

答案 3 :(得分:0)

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