这是我参与「第四届青训营 」笔记创作活动的第6天,在第六节课中主要了解到了大数据Shuffle有关的知识。
Shuffle概述
MapReduce概述
- Map阶段,是在单机上进行的针对一小块数据的计算过程
- Shuffle阶段:在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备
- Reduce阶段:对移动后的数据进行处理,依然是在单机上处理一小份数据
为什么shuffle对性能非常重要
- M*R 次网络连接
- 大量的数据移动
- 数据丢失风险
- 可能存在大量的排序操作
- 大量的数据序列化、反序列化操作
- 数据压缩
总结
- 在大数据场景下,数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。
- 目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
Shuffle算子
Shuffle算子分类
Spark中对shuffle的抽象
- 窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
- 宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖
Shuffle Dependency构造
- Partitioner
- Aggregator
Shuffle过程
Shuffle实现的发展历程
Hash Shuffle
- 写数据:每个partion会映射到一个独立的文件
- 写数据优化:每个partition会映射到一个文件片段
Sort shuffle:写数据
- 每个task生成一个包含所有partition数据的文件
Shuffle--读数据
- 每个reduce task分别获取所有map task生成的属于自己的片段
Push Shuffle
为什么需要push shuffle
- Avg IO size太小,造成了大量的随机IO,严重影响磁盘的吞吐
- M*R 次度请求,造成大量的网络连接,影响稳定性
Push Shuffle的实现
Magnet实现原理
- Spark driver组件,协调整体的shuffle操作
- map任务的shuffle writer过程完成后,增加了一个额外的操作push-merge,将数据复制一份推导远程shuffle服务上
- magnet shuffle service是一个强化版的ESS。
- reduce任务从magnet shuffle service接收合并好的shuffle数据
Magnet可靠性
- 如果Map task输出的Block没有成功push到magnet上,并且反复重试仍然失败,则reduce task直接从ESS上拉取原始block数据
- 如果Magnet上的block因为重复或者冲突等原因,没有正常完成merge的过程,则reduce task直接拉取未完成merge的block
- 本质上,magnet中维护了两份shuffle数据的副本