CodeWalk

MapReduce Combiner与Partitioner的区别

作者:古法程序员 · 2026-05-30 12:55

请说明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
  • 默认策略: HashPartitionerhash(key) % numReduceTasks
  • 自定义场景: 需要全排序(TotalOrderPartitioner)、数据倾斜处理、按业务分组
  • 结果: 每个分区内的数据会进入同一个Reduce Task

区别对比表: | 维度 | Combiner | Partitioner | |------|----------|-------------| | 执行阶段 | Map端Spill/Merge时 | Map端输出时 | | 目的 | 减少数据传输量 | 决定数据去哪个Reduce | | 是否可选 | 可选(优化) | 必须(未指定使用默认) | | 对结果的影响 | 无影响(仅优化) | 决定最终输出文件个数和分布 | | 函数签名 | (K2,V2)→(K2,V2) | (K2,V2)→int |

典型示例: 词频统计中,Combiner做局部计数,Partitioner保证相同单词进入同一个Reduce。