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

Posted

技术标签:

【中文标题】组合器和分区器之间的区别【英文标题】:Difference between combiner and partitioner 【发布时间】:2016-07-25 08:26:22 【问题描述】:

我是 MapReduce 的新手,我只是无法弄清楚分区器和组合器的区别。我知道两者都在 map 和 reduce 任务之间的中间步骤中运行,并且都减少了 reduce 任务要处理的数据量。请举例说明区别。

【问题讨论】:

Partitioners 不会减少数据量,他们决定 哪个 reducer 将处理给定的 key,即他们控制数据在 map 阶段之后的去向。 【参考方案1】:

首先,同意@Binary nerd的评论

Combiner 可以看作是 map 阶段的 mini-reducer。他们表演 在分配映射器结果之前对其进行本地缩减 更远。一旦执行了Combiner功能,然后 传递给 Reducer 进行进一步的工作。

Partitioner 在我们进行更多工作时出现在哪里 不止一个减速器。所以,分区器决定哪个reducer是 负责特定的密钥。他们基本上采用Mapper 结果(如果使用Combiner,则使用Combiner Result)并将其发送到 基于key负责的Reducer

使用 Combiner 和 Partitioner 场景:

只有 Partitioner 的场景:

例子:

Combiner Example

分区示例:

分区阶段发生在映射阶段之后和 减少阶段。分区数等于 减速机。数据在 reducer 之间根据 分区函数。分区器的区别 而一个combiner就是partitioner将数据按照 reducer 的数量,以便单个分区中的所有数据都得到 由单个 reducer 执行。然而,组合器的功能类似 到reducer并处理每个分区中的数据。合路器 是对减速器的优化。默认分区函数 是哈希分区函数,其中在 钥匙。但是,根据以下方式对数据进行分区可能会很有用 键或值的其他一些功能。 -- Source

【讨论】:

【参考方案2】:

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

假设您有一个包含 2 个映射器和 1 个缩减器的 MapReduce 字数统计作业。

没有组合器。

"hello hello there" => ma​​pper1 => (hello, 1), (hello,1), (there,1)

"howdy howdy again" => ma​​pper2 => (howdy, 1), (howdy,1), (again,1)

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

使用 Reducer 作为组合器

"hello hello there" => ma​​pper1combiner => (hello, 2), (there,1)

"howdy howdy again" => ma​​pper2combiner => (howdy, 2), (again,1)

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

结论

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

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

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

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

【讨论】:

以上是关于组合器和分区器之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

[QNX 自适应分区用户指南]8 自适应分区线程调度器和其他线程调度器

[QNX 自适应分区用户指南]9 同时使用线程调度器和多核

Apache Flink流分区器剖析

在调试信息压缩标志的各种组合下,汇编器和链接器之间的压缩调试信息如何流动?

全局索引和本地索引的区别

选区解析器和依赖解析器之间的区别