这是我参与「第四届青训营 」笔记创作活动的的第6天.
课程内容
01.Shuffle 概述
02.Shuffle 算子
03.Shuffle 过程
04.Push Shuffle
01.Shuffle 概述
MapReduce
map阶段:主要是实现数据分类
Shuffle节点:主要实现数据的移动与整合
reduce阶段:对不同种类的数据分别进行统计处理
MapReduce把数据处理带到了一个新的阶段--大数据处理。
Shuffle对性能很重要的原因:
02.Shuffle 算子
分类:
应用:
Spark源码中RDD的单元测试: spark/RDDSuite.scala at master · apache/spark (github.com)
Spark源码中PairRDDFunctions的单元测试: spark/PairRDDFunctionsSuite.scala at master · apache/spark (github.com)
宽依赖和窄依赖是Spark中对Shuffle的抽象
算子内部的依赖:
Shuffle Dependency 构造
重要的两个部分:
1)Partitioner
2)Aggregator
03.Shuffle 过程
写数据-Hash Shuffle
每一个partition都映射到一个独立的文件
Hash Shuffle 的优化
每一个partition都映射到一个文件片段
Sort shuffle-写数据
每个task只生成一个包含所有partition数据的文件和一个index file(记录每个partition在数据文件中的偏移),优于 Hash shuffle(hash shuffle只适合在数据少的时候使用)。
读数据时,Hash Shuffle和Sort Shuffle性能一样。
Shuffle 过程的触发流程
在Register Shuffle时做的最重要的事情是根据不同条件创建不同的Shuffle Handle
Shuffle Handle对应了Shuffle的实现方式,一共有三种。
不同的Shuffle Handle 对应不同的Shuffle Writer:
Writer的实现
1)BypassMergeSortShuffle Writer
适用于partition数量较少的情况(partition数量小于200)
2)UnsafeShuffleWriter
当Partition数量较多的时候,需要排序了;
使用堆外内存,数据通过序列化写入堆外内存;数据写入后不再反序列化。
UnsafeShuffleWriter 对于堆外内存的管理。
3)SortShuffleWriter
Reader的实现
网络时序图
Shuffle优化使用的技术-Zero Copy
shuffle倾斜的问题:
某一类数据很多,导致端到端的处理时间延长(多类数据共同处理)
常见的shuffle倾斜处理方法:
- 提高并行度
2. Spark AQE Skew Join
Spark 3.0 发布的shuffle实现方法
04.Push Shuffle
目前业界最新的一个shuffle的实现方法