Hadoop 在MapReduce中何时调用合并器?

Hadoop 在MapReduce中何时调用合并器?,hadoop,mapreduce,combiners,Hadoop,Mapreduce,Combiners,组合器是使用与reducer相同的类和基本相同的代码制作的。 但问题是,它究竟是在排序和洗牌之前调用的,还是在何时减少之前调用的? 如果在排序和洗牌之前。e、 ,就在mapper之后,然后它将如何获得作为[键,列表]的输入?因为这是通过排序和洗牌给出的。 现在如果在排序和洗牌i之后调用它。e、 ,就在reducer之前,然后输出到组合器的是[key,value]与reducer类似,那么reducer将如何作为[key,list]获得输入?组合器的输出类型必须匹配映射器的输出类型。Hadoop不

组合器是使用与reducer相同的类和基本相同的代码制作的。 但问题是,它究竟是在排序和洗牌之前调用的,还是在何时减少之前调用的? 如果在排序和洗牌之前。e、 ,就在mapper之后,然后它将如何获得作为
[键,列表]
的输入?因为这是通过排序和洗牌给出的。
现在如果在排序和洗牌i之后调用它。e、 ,就在reducer之前,然后输出到组合器的是
[key,value]
与reducer类似,那么reducer将如何作为
[key,list]
获得输入?

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

如果您的映射器扩展了
映射器
,并且您的还原器扩展了
还原器
,则组合器必须是
还原器的扩展

组合器
映射
操作应用在同一台机器上。肯定是在洗牌之前

参考Hadoop文档:

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


组合器就像一个预减速机,它将在排序和洗牌阶段之前的映射阶段之后很快应用

它将应用于处理map阶段的同一主机上,最大限度地减少下一个处理阶段(排序洗牌和减少)的网络数据传输


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

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

实际上是在映射阶段之后,排序和洗牌之前。在映射阶段之后,输出将通过管道传输到下一个排序和洗牌阶段,合并器在该排序和洗牌阶段之前操作。这就像,Map->Combiner->Sort n Shuffle->Reducer

如果它在Shuffle之前运行,那么这意味着它需要mapper的输入,但是Combiner的输入是键,list,这种类型的输出来自Sort和Shuffle阶段,那么它如何在Sort和Shuffle之前运行。我进一步澄清了我的答案。请看一看。是的,这是combiner的功能,这是正确的,但我的问题是它在mapper、s&s和reducer的管道中的确切位置被调用。实际上,它是在映射阶段之后,排序和洗牌之前。在映射阶段之后,输出将通过管道传输到下一个排序和洗牌阶段,合并器在该排序和洗牌阶段之前操作。这就像,映射->合并器->排序n洗牌->还原可能的重复对不起,我不这么认为,我认为顺序是“映射->内存中的缓冲->分区->排序->合并器->溢出到磁盘->还原”