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

时间:2016-07-25 08:26:23

标签: hadoop mapreduce partitioner

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

2 个答案:

答案 0 :(得分:10)

首先,同意 @Binary nerd 的评论

  

可以在地图阶段将Combiner视为迷你缩减器。他们表演   mapper结果在发布之前进行local-reduce   进一步。一旦执行了Combiner功能,就可以了   传递给Reducer进行进一步的工作。

     

当我们开展更多工作时,Partitioner会出现在图片中   比一个减速机。因此,分区器决定哪个减速器   负责一个特定的密钥。他们基本上采用Mapper   结果(如果使用Combiner然后Combiner结果)并将其发送给   负责任的基于密钥的Reducer

使用Combiner和Partitioner方案: enter image description here

仅限分区程序方案:

enter image description here

示例:

  • Combiner Example

  • 分区程序示例:

      

    分区阶段发生在地图阶段之后和之前   减少阶段。分区数等于数量   减速。根据数据,数据在Reducer之间进行分区   分区功能。分区器之间的区别   组合器是分区器根据数据划分数据的   reducer的数量,以便单个分区中的所有数据都可以获得   由一个减速机执行。但是,组合器的功能类似   到reducer并处理每个分区中的数据。组合器   是对减速器的优化。默认分区功能   是散列分区函数,其中散列完成   键。但是根据分区数据可能很有用   键的一些其他功能或值。 - Source

答案 1 :(得分:6)

我认为一个小例子可以非常清楚而快速地解释这一点。

假设你有一个带有2个映射器和1个减速器的MapReduce字数工作。

没有组合。

"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 合并器 => (hello, 2), (there,1)

"howdy howdy again" =>使用合并器 => mapper2 (howdy, 2), (again,1)

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

结论

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

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

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

job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);