这是我参与「第四届青训营 」笔记创作活动的的第4天。
一、Shuffle概述
1. Shuffle是什么
MapReduce
- Map:单机上对一小块数据进行的计算过程
- Shuffle: Map阶段基础上进行数据移动,为后续的Reduce阶段做准备
- Reduce: 对移动后的数据进行处理,依然是单机上处理一小份数据
2. 为什么需要Shuffle
Shuffle的挑战:对性能影响重要
- M*R次网络链接
- 大量数据移动
- 数据丢失风险
- 大量排序操作
- 大量数据序列化、反序列化
- 数据压缩
3. Shuffle的基本过程
Shuffle表示了不同分区数据交换的过程,不同的Shuffle策略性能差异大。
二、Shuffle算子
1. Repartition
- coalesce
- repartition
2. ByKey
- groupByKey
- reduceByKey
- aggregateByKey
- combineByKey
- sortByKey
- sortBy
3. Join
- cogroup
- join
- leftOuterJoin
- intersection
- subtract
- subtractByKey
4. Distinct
- distinct
Shuffle Dependency构造
- Single K-V pair RDD
- Partitioner
- numberPartitions
- getPartition
- HashPartitioner
- Serializer
- Optional Key Ordering
- Optional Aggregator
- createCombiner:只有一个value的时候
- mergeValue: 合并一个value到Aggregator
- mergeCombiner: 合并两个Aggregator
- mapSideCombine
三、Shuffle过程——Spark中Shuffle的核心原理
1. Hash Based Shuffle
- Spark1.2默认方式从HBS改为Sort Based Shuffle
- Spark2.0 HBS退出历史舞台
- 每个partition映射到一个文件片段
2. Sort Shuffle
- 写:每个task生成一个包含所有partition数据的文件
- 读:每个Reduce task分别获取所有map task生成的属于自己的片段
3. Shuffle过程的触发
- Collect Action
- Submit Job
- Get Dependencies
- Register Shuffle
4. Shuffle Handle的创建
Register Shuffle 最重要的事:根据不同条件创建不同的shuffle handle
4.1 Shuffle Handle的创建
- BypassMergeSortShuffleHandle <-> *ShuffleHandle
- Serialied* <-> *
- Base* <-> *
4.2 Writter的实现
- BypassMergeWriter
- 不需要排序,节省时间
- 写操作会打开大量文件
- 类似Hash Shuffle
- UnsafeShuffleWriter
- 类似内存页储存序列化数据
- 数据写入后不再反序列化
- 只根据partition排序Long Array
- 数据不移动
- SortShuffleWriter
- 支持combine
- combine时使用PartitionedAppendOnlyMap,是个hashtable
- 不需要combine: partitionedPairBuffer是个array
4.3 Reader实现
- 网络时序图
- ShuffleBlockFetchIterator
- External Shuffle Service
4.4 Shuffle优化使用的技术
- Zero Copy
- Netty Zero Copy
- 避免Shuffle, 使用broadcast替代join
- mapside join 预聚合算子
- 倾斜优化
- 提高并行度
- AQE Skew Join
四、Push Shuffle——各个社区包括Spark3.2的方案及字节方案
1. 为什么
- Avg IO size太小,大量随机IO
- M*R次读请求,大量网络连接,影响稳定性
2. 实现方案
- Facebook: cosco
- Bytedance: CSS
- Spark3.2: push based shuffle
- Tencent: FireStorm
3. Magnet实现原理
Spark Driver的组件,是强化的ESS
- bitmap
- position offset
- currentMapId Cloud Shuffle Service思想
- 写入速度
- 主从inmemory副本,异步刷盘,极低的失败几率换取高速写入速度
- IO聚合
- 所有mapper同一个partition数据都远程写到同一个文件
- 备份
- HDFS太重,使用双磁盘副本 Cloud Shuffle Service AQE