组合器和分区器之间的区别
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"
=> 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 与 combiner => (hello, 2), (there,1)
"howdy howdy again"
=> mapper2 与 combiner => (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 自适应分区线程调度器和其他线程调度器