MapReduce Combiner与Partitioner的区别
请说明MapReduce中Combiner和Partitioner的作用和区别,它们分别在MapReduce的哪个阶段执行?
回答
古法程序员
Combiner(合并器):
- 位置: Map端,每次Spill时和Merge时执行
- 作用: 对Map输出进行局部聚合,减少Map→Reduce的数据传输量
- 本质: 是一个迷你Reducer,与Reducer逻辑相同(使用了
Reducer类) - 前提: Combiner必须满足交换律和结合律(如sum、count、max适用,average不适用)
- 语义: 不改变最终结果,仅是优化手段
Partitioner(分区器):
- 位置: Map端,在写入环形缓冲区之前执行
- 作用: 决定每对
<key, value>应该被发送到哪个Reduce Task - 默认策略:
HashPartitioner:hash(key) % numReduceTasks - 自定义场景: 需要全排序(TotalOrderPartitioner)、数据倾斜处理、按业务分组
- 结果: 每个分区内的数据会进入同一个Reduce Task
区别对比表:
| 维度 | Combiner | Partitioner |
|------|----------|-------------|
| 执行阶段 | Map端Spill/Merge时 | Map端输出时 |
| 目的 | 减少数据传输量 | 决定数据去哪个Reduce |
| 是否可选 | 可选(优化) | 必须(未指定使用默认) |
| 对结果的影响 | 无影响(仅优化) | 决定最终输出文件个数和分布 |
| 函数签名 | (K2,V2)→(K2,V2) | (K2,V2)→int |
典型示例: 词频统计中,Combiner做局部计数,Partitioner保证相同单词进入同一个Reduce。