这是我参与「第四届青训营 」笔记创作活动的第5天
Shuffle概述
什么是shuffle?
在最初的大数据计算工具MR任务中的map与reduce间需要进行Shuffle,Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂。数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
为什么shuffle如此重要
- M·R次网控连接
- 大量的数据移动
- 数据丢失风险
- 可能存在大量的排序操作
- 大量的数据序列化、反序列化接作
- 数据压缩
Shuffle算子
分类
- repartition:重新选择分区
- Bykey:通过键分类
- join:聚合
- distinct:归类
Spark中对shuffle的抽象
- 宽依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
- 窄依赖:父RDD的分片可能被子RDD中的多个分片所依赖
Shuffle过程
spark中的shuffle的发展过程
-
Spark 0.8及以前 Hash Based Shuffle
-
Spark 0.8.1为Hash Based Shuffle引入File Consolidation机制
-
Spark 0.9引入ExternalAppendOnlyMap
-
Spark 1.1引入Sort Based Shuffle,但默认仍为Hash Based Shuffle
-
Spark 1.2默认的Shuffle方式改为Sort Based Shuffle
-
Spark 1.4引入Tungsten-Sort Based Shuffle
-
Spark 1.6 Tungsten-Sort Based Shuffle并入Sort Based Shuffle
-
Spark 2.0 Hash Based Shuffle退出历史舞台
HashShuffle
- 优点:不需要排序
- 缺点:打开,创建的文件过多
SortShuffle
- 优点:打开的文件少、支持map-side combine
- 缺点:需要排序
TungstenSortShuffle
- 优点:更快的排序效率,更高的内存利用效率
- 缺点:不支持map-side combine
3.2 Register Shuffle
-
由action算子触发DAG Scheduler进行shuffle register
-
Shuffle Register会根据不同的条件决定注册不同的ShuffleHandle
-
三种ShuffleHandle对应了三种不同的ShuffleWriter的实现
- BypassMergeSortShuffleWriter:HashShuffle
- UnsafeShuffleWriter:TunstonShuffle
- SortSHuffleWriter:SortShuffle
Push Shuffle
shuffle过程存在问题
- 数据存储在本地磁盘,没有备份
- IO 并发:大量 RPC 请求(M*R)
- IO 吞吐:随机读、写放大(3X)
- GC 频繁,影响 NodeManager
Magnet实现原理
主要流程
主要为边写边push的模式,在原有的shuffle基础上尝试push聚合数据,但并不强制完成,读取时优先读取push聚合的结果,对于没有来得及完成聚合或者聚合失败的情况,则fallback到原模式。