组合器和分区器之间的区别

har*_*hit 7 hadoop mapreduce partitioner

我是MapReduce的新手,我无法弄清楚分区器和组合器的区别.我知道两者都在map和reduce任务之间的中间步骤中运行,并且都减少了reduce任务要处理的数据量.请用一个例子来解释差异.

Ram*_*ram 11

首先,同意@Binary nerd的评论

可以在地图阶段将组合器视为迷你减速器.它们在进一步分发之前对映射器结果执行local-reduce.一旦执行了Combiner功能,它就会被传递给Reducer以进行进一步的工作.

其中,作为Partitioner进入,当我们在一个以上的减速的工作画面.因此,分区程序决定哪个reducer负责特定键.它们基本上取Mapper 结果(如果Combiner使用Combiner结果),并根据键将其发送到负责的Reducer

使用Combiner和Partitioner场景: 在此输入图像描述

仅使用分区程序方案:

在此输入图像描述

例子 :

  • 组合器示例

  • 分区程序示例:

    分区阶段发生在映射阶段之后和减少阶段之前.分区数等于reducer数.根据分区功能,数据在Reducer之间进行分区.分区器和组合器之间的区别在于分区器根据reducer的数量来划分数据,以便单个分区中的所有数据都由单个reducer执行.但是,组合器的功能类似于reducer,并处理每个分区中的数据.组合器是减速器的优化.默认分区功能是散列分区功能,其中对密钥进行散列.但是,根据密钥或值的某些其他功能对数据进行分区可能很有用.- 来源


Nic*_*mak 8

我想一个小例子可以非常清楚和迅速地解释这一点.

假设你有一个带有2个映射器和1个reducer的MapReduce字数统计工作.

没有Combiner.

"hello hello there"=> mapper1 =>(hello, 1), (hello,1), (there,1)

"howdy howdy again"=> mapper2 =>(howdy, 1), (howdy,1), (again,1)

两个输出都到达reducer =>(again, 1), (hello, 2), (howdy, 2), (there, 1)

使用Reducer作为组合器

"hello hello there"=> mapper1 with combiner =>(hello, 2), (there,1)

"howdy howdy again"=> mapper2 with combiner => (howdy, 2), (again,1)

两个输出都到达reducer =>(again, 1), (hello, 2), (howdy, 2), (there, 1)

结论

最终结果是相同的,但是当使用组合器时,地图输出已经减少.在此示例中,您只向输出器发送2对输出而不是3对.因此,您获得IO /磁盘性能.这在聚合值时很有用.

Combiner实际上是应用于map()输出的Reducer.

如果您看一下第一个Apache MapReduce教程,它恰好是我刚才说明的mapreduce示例,您可以看到它们使用reducer作为组合器:

job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
Run Code Online (Sandbox Code Playgroud)