这是我参与「第四届青训营 」笔记创作活动的的第8天
Shuffle概述
- MapReduce存在 Map、Shuffle、Reduce三个阶段
- Map阶段,在单机上进行的针对一小块数据的计算过程
- Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备
- Reduce阶段,对移动后的数据进行处理,仍然是在单机上处理一小份数据
- 为什么Shuffle对性能非常重要?
- M * R 次网络连接
- 大量的数据移动
- 数据丢失风险
- 可能存在的大量的排序操作
- 大量的数据序列化、反序列化操作
- 数据压缩
目前各个引擎中的shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
Shuffle算子
-
repartition
- coalesce、repartition
-
ByKey
- groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKeysortBy
-
Join
- cogroup、join
-
Distinct
- distinct 可以看成特殊的分区操作
Spark 算子会shuffle是因为产出了数据移动
窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖 宽依赖:父RDD中的分片可能被子RDD的多个分片所依赖
Shuffle过程
Write 实现
UnSafeShuffleWriter
SafeShuffleWriter
Read 实现
网络时序图