这是我参与「第四届青训营 」笔记创作活动的第6天
shuffle概述
所谓shuffle就是指把数据打乱重新组合。指数据从map task输出到reduce task输入的这段过程。
Mapreduce
- map阶段:在单机上进行的针对一小块数据的计算
- shuffle阶段:在map阶段的基础上,进行数据移动
- reduce阶段:对移动后的数据进行处理,依然是在单机上处理一小份数据
为什么shuffle如此重要
- 数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
shuffle算子
常见的触发shuffle的算子
-
repartition
- coalesce、repartition
重分区一般会shuffle,因为需要在整个集群中,对之前所有的分区的数据进行随机,均匀的打乱,然后把数据放入下游新的指定数量的分区内。
-
ByKey
- groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKeysortBy
byKey类的操作要对一个key,进行聚合操作,那么肯定要保证集群中,所有节点上的相同的key,移动到同一个节点上进行处理。
-
Join
- cogroup、join
两个rdd进行join,就必须将相同join key的数据,shuffle到同一个节点上,然后进行相同key的两个rdd数据的笛卡尔乘积。
shuffle过程
HashShuffle
- 优点:不需要排序
- 缺点:打开,创建的文件过多
SortShuffle
- 优点:打开的文件少、支持map-side combine
- 缺点:需要排序
TungstenSortShuffle
- 优点:更快的排序效率,更高的内存利用效率
- 缺点:不支持map-side combine
push shuffle
shuffle过程存在哪些问题?
- 数据存储在本地磁盘,没有备份
- IO 并发:大量 RPC 请求(M*R)
- IO 吞吐:随机读、写放大(3X)
- GC 频繁,影响 NodeManager
为了优化该问题,有很多公司都做了思路相近的优化,push shuffle