reduceByKey 会将上一个 RDD 中的每一个 key 对应的所有 value 聚合 成一个 value,然后生成一个新的 RDD,元素类型是<key,value>对的 形式,这样每一个 key 对应一个聚合起来的 value。
问题:聚合之前,每一个 key 对应的 value 不一定都是在一个 partition 中,也不太可能在同一个节点上,因为 RDD 是分布式的弹性 的数据集,RDD 的 partition 极有可能分布在各个节点上。
如何聚合?
- Shuffle Write:上一个 stage 的每个 map task 就必须保证将自己 处理的当前分区的数据相同的 key 写入一个分区文件中,可能会写入多 个不同的分区文件中。
- – Shuffle Read:reduce task 就会从上一个 stage 的所有 task 所在 的机器上寻找属于己的那些分区文件,这样就可以保证每一个 key 所对 应的 value 都会汇聚到同一个节点上去处理和聚合。
Spark 中有两种 Shuffle 管理类型,HashShufflManager 和 SortShuffleManager,Spark1.2 之前是 HashShuffleManager, Spark1.2 引入 SortShuffleManager,在 Spark 2.0+版本中已经将 HashShuffleManager 丢弃。