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
仅使用分区程序方案:
例子 :
分区程序示例:
分区阶段发生在映射阶段之后和减少阶段之前.分区数等于reducer数.根据分区功能,数据在Reducer之间进行分区.分区器和组合器之间的区别在于分区器根据reducer的数量来划分数据,以便单个分区中的所有数据都由单个reducer执行.但是,组合器的功能类似于reducer,并处理每个分区中的数据.组合器是减速器的优化.默认分区功能是散列分区功能,其中对密钥进行散列.但是,根据密钥或值的某些其他功能对数据进行分区可能很有用.- 来源
我想一个小例子可以非常清楚和迅速地解释这一点.
假设你有一个带有2个映射器和1个reducer的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 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)
| 归档时间: |
|
| 查看次数: |
6441 次 |
| 最近记录: |