这是我参与「第四届青训营 」笔记创作活动的第7天。
以下是我对课上所做笔记的一些整理。
shuffle
MapReduce工作原理
map-shuffle-reduce
为什么shuffle是优化的重点?
shuffle 算子
会产生shuffle的算子的分类
-
repartition repatition、coalesce
-
ByKey xxByKey
-
join cogroup、join、leftOuterJoin、intersection、substract、subtractByKey
-
Distinct
应用————以wordcount为例
宽依赖 窄依赖——spark对shuffle的抽象
shuffle dependency 源码剖析
partitoner
Aggregator
shuffle发展历程及其设计思想
写:
hash shuffle
优化处理:每个partiton映射到一个文件片段
sort shuffle
排序会消耗cpu资源,但是每个task生成一个包含所有partiton数据的文件
读:
shuffle读数据
shuffle handler与writer的对应关系
BypassMergeShuffleWriter
UnsafeShuffleWriter
为什么是unsafe?
——————用了堆外内存。
堆外内存的管理
- 为什么需要限制partition数量不超过2^24次方? 因为Long Array的前24位bit用于记录partition,超过就溢出了。
sortshufflewriter 放在堆内
Reader实现——网络时序图
ShuffleBlockFetchIterator
shuffle优化使用的技术:Netty zero copy
好处:
常见问题
shuffle优化
避免shuffle
- 使用broadcast代替join
- 使用可以map-side预聚合的算子
参数优化
倾斜优化
- 提高并行度
- Spark AQE Skew join AQE将倾斜的分区打散,对各个小分区join
Push shuffle
Magnet Push Shuffle
实现原理:
Cloud shuffle service
设计思想:
架构图
写入和读取流程
(红框为写入,绿框为读取)
AQE
- 在聚合文件时主动将文件切分为若干块,当触发AQE时,按照已经切分好的文件块进行拆分。
- 一个partition会对应多个epoch file,截至目前,单个epoc的大小是512MB。