这是我参与「第四届青训营 」笔记创作活动的第7天
- 数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
1. Shuffle概述
1.1 MapReduce概述
1)Map阶段,是在单机上针对一小部分数据的计算过程
2)Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备
3)reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小分数据
1.2 shuffle对性能很重要
M*R次网络连接
大量的数据移动
数据丢失风险
可能存在大量的排序操作
大量的数据序列化、反序列化操作
数据压缩
2. Shuffle算子
2.1 Shuffle分类
1) repartition:改变分区的过程
2)ByKey:把相同的Key聚合到一次的操作(比如把相同类型的数据聚合在一次的过程)
3) join:把本身没有联系的数据按某种条件连接到一次的过程
4)Distinct:特殊的bykey操作
2.2 Shuffle Dependency 构造
shuffle Dependency是Shuffle算子的抽象实现
3. Shuffle过程
3.1 Hash Shuffle-写数据
每个partition会映射到一个独立的文件
3.2 Hash Shuffle-写数据优化
每个partition会映射到一个文件片段
3.3 sort shuffle :写数据
每个task生成一个包含所有partition数据的文件
3.4 shuffle读数据
每个reduce task分别获取所有map task生成的属于自己的片段
3.5 shuffle触发过程
CollectAction
SubmitJob
GetDependencies
RegisterShuffle
3.6 Shuffle Handle 的创建
Register Shuffle时做的最重要的事情是根据不同条件创建不同的shuffle Handle
3.7 Shuffle Handle与Shuffle writer的关系
- BypassMergeSortShuffleWriter
- 不需要排序,节省时间
- 写操作的时候会打开大量文件
- 类似与hash shuffle
2)UnsafeShuffleWriter
- 使用类似内存页存储序列化数据
- 数据写入后不再反序列化