Spark核心算子对比:`reduceByKey`与`groupByKey`源码级解析及生产调优指南
Spark核心算子对比:reduceByKey
与groupByKey
源码级解析及生产调优指南
1. 核心机制对比
在Spark中,reduceByKey
和groupByKey
都是对键值对RDD(RDD[(K, V)]
)进行聚合操作的高阶算子,但两者的底层实现和性能表现截然不同。
特性 | reduceByKey |
groupByKey |
---|---|---|
Shuffle前预聚合 | ✅ 启用(mapSideCombine=true ) |
❌ 禁用(mapSideCombine=false ) |
内存消耗 | 低(部分聚合结果缓存) | 高(全量数据缓存) |
Shuffle数据量 | 小(仅传输合并后的中间结果) | 大(传输所有原始数据) |
适用场景 | 聚合类操作(求和、求最大值等) | 非聚合类操作(如全量数据收集) |
2. 源码深度解析
2.1 reduceByKey
实现剖析
// 源码路径:org.apache.spark.rdd.PairRDDFunctions
def reduceByKey(func: (V, V) => V): RDD[(K, V)] = {
combineByKeyWithClassTag[V](
createCombiner = (v: V) => v, // 初始值:直接取第一个元素
mergeValue = func, // 分区内合并函数(Map端)
mergeCombiners = func,