这是我参与「第四届青训营 」笔记创作活动的第6天
1. Shuffle概述
1.1 什么是shuffle?
shuffle的作用就是把map阶段和reduce阶段连接起来,充当一个桥梁的作用。 shuffle只能产生[k,v]类型的PairRDD中,Map端的数据被Reduce端fetch时,是通过key的hashcode分发到每一个Reducer上,此过程被叫做shuffle。
shulle过程中经历磁盘读写和网络传输,这是影响shuffle效率的根本原因。所以要进行shuffle调优。
具体来说shuffle过程中就是将数据从数据在map阶段产生的结果都在不同的机器上,要经过网络传输发送到Reducer上在进行聚合的一个过程。发生网络传输个过程也叫shuffle。
下个stage向上个stage要数据的过程被叫做shuffle。
RDD角度:sparkRDD模型中将数据分为partion,这些partion分发在不同的机器上,分区之间通过网络传输交换数据,分区的函数无法满足执行函数的要求,比如reducebykey等,需要重新进行聚合,这个过程也被叫叫做shuffle。
1.2 为什么shuffle如此重要
- M·R次网控连接
- 大量的数据移动
- 数据丢失风险
- 可能存在大量的排序操作
- 大量的数据序列化、反序列化接作
- 数据压缩
2. Shuffle算子
2.1 常见的触发shuffle的算子
-
repartition
coalesce、repartition
-
ByKey
groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKeysortBy
-
Join
cogroup、join
-
Distinct
- 算子使用例子
val text = sc.textFile("mytextfile.txt")
val counts = text
.flatMap(line => line.split(" "))
.map(word => (word,1))
.reduceByKey(_+_)
counts.collect
2.2 Spark中对shuffle的抽象
- 宽依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
- 窄依赖:父RDD的分片可能被子RDD中的多个分片所依赖
3. shuffle过程
-
spark中的shuffle变迁过程
-
HashShuffle
- 优点:不需要排序
- 缺点:打开,创建的文件过多
-
SortShuffle
- 优点:打开的文件少、支持map-side combine
- 缺点:需要排序
-
TungstenSortShuffle
- 优点:更快的排序效率,更高的内存利用效率
- 缺点:不支持map-side combine
-
-
Register Shuffle
- 由action算子触发DAG Scheduler进行shuffle register
- Shuffle Register会根据不同的条件决定注册不同的ShuffleHandle
3. Push Shuffle
3.1 为什么需要Push Shuffle
问题:
- 数据存储在本地磁盘,没有备份
- IO 并发:大量 RPC 请求(M*R)
- IO 吞吐:随机读、写放大(3X)
- GC 频繁,影响 NodeManager
3.2 各公司优化思路
-
Facebook: cosco
-
LinkedIn:magnet
-
Uber:Zeus
-
Alibaba: RSS
-
Tencent: FireStorm
-
Bytedance: Cloud Shuffle Service
-
Spark3.2: push based shuffle
总结
在这节课中我学习了:
- spark中的shuffle算子:spark中的会产生shuffle的算子,了解了其基本特性;
- spark中的shuffle过程:spark中shuffle的核心原理和实现细节;
- Push based shuffle:push shuffle社区的实现方案以及字节的实现方案;