这是我参与「第四届青训营 」笔记创作活动的的第3天
Shuffle概述
MapReduce——map阶段、shuffle阶段、reduce阶段。
shuffle算子
常见算子
repartition、bykey、join、distinct
宽依赖、窄依赖
窄依赖:父RDD的每个分片至多被RDD中的一个分片所依赖
宽依赖:父RDD的每个分片被RDD中的多个分片所依赖
Shuffle Dependency
Shuffle Dependency
- 创建会产生shuffle的RDD时,RDD会创建Shuffle Dependency来描述Shuffle相关的信息
- 构造函数
- A single key-value pair RDD, i.e. RDD[Product2[K, V]],
- Partitioner (available as partitioner property),根据key创建对应的文件
- Serializer,
- Optional key ordering (of Scala’s scala.math.Ordering type),
- Optional Aggregator,
- mapSideCombine flag which is disabled (i.e. false) by default.
Aggregator
Aggregator
- 在map侧合并部分record的函数
- 接口
- createCombiner:只有一个value的时候初始化的方法
- mergeValue:合并一个value到Aggregator中
- mergeCombiners:合并两个Aggregator
Shuffle过程
Shuffle变迁过程
- HashShuffle
- 优点:不需要排序
- 缺点:打开,创建的文件过多
- SortShuffle
- 优点:打开的文件少、支持map-side combine
- 缺点:需要排序
- TungstenSortShuffle
- 优点:更快的排序效率,更高的内存利用效率
- 缺点:不支持map-side combine
Shuffle Handle的创建
Register Shuffle根据不同条件创建不同的shuffle handle
Writer实现
- BypassMergeShuffleWriter
- UnsafeShuffleWriter
- SortSHuffleWriter
Reader
External Shuffle Service
为了解决Executor为了服务数据的fetch请求导致无法退出问题,我们在每个节点上部署一个External Shuffle Service,这样产生数据的Executor在不需要继续处理任务时,可以随意退出。
Push Shuffle
Magnet
\
主要为边写边push的模式,在原有的shuffle基础上尝试push聚合数据,但并不强制完成,读取时优先读取push聚合的结果,对于没有来得及完成聚合或者聚合失败的情况,则fallback到原模式。
-
Cloud Shuffle Service架构
- Zookeeper WorkerList [服务发现]
- CSS Worker [Partitions / Disk | Hdfs]
- Spark Driver [集成启动 CSS Master]
- CSS Master [Shuffle 规划 / 统计]
- CSS ShuffleClient [Write / Read]
- Spark Executor [Mapper + Reducer]
-
Cloud Shuffle Service 读写流程
-
Cloud Shuffle Service 支持AQE
- 在聚合文件时主动将文件切分为若干块,当触发AQE时,按照已经切分好的文件块进行拆分。