我是MapReduce的新手,我无法弄清楚分区器和组合器的区别。我知道两者都在map和reduce任务之间的中间步骤中运行,并且都减少了reduce任务要处理的数据量。请用一个例子来解释差异。
答案 0 :(得分:10)
首先,同意 @Binary nerd 的评论
可以在地图阶段将Combiner视为迷你缩减器。他们表演 mapper结果在发布之前进行local-reduce 进一步。一旦执行了Combiner功能,就可以了 传递给Reducer进行进一步的工作。
当我们开展更多工作时,
Partitioner
会出现在图片中 比一个减速机。因此,分区器决定哪个减速器 负责一个特定的密钥。他们基本上采用Mapper
结果(如果使用Combiner
然后Combiner
结果)并将其发送给 负责任的基于密钥的Reducer
仅限分区程序方案:
示例:
分区程序示例:
分区阶段发生在地图阶段之后和之前 减少阶段。分区数等于数量 减速。根据数据,数据在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)
"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);