大数据Shuffle原理与实践 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第8天
上节课我们学习了Spark,明白了Spark的原理和生态,也了解了RDD的概念,引出了SparkSQL,今天我们来学习大数据Shuffle原理与实践
Shuffle概述
MapReduce概述
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,2004年谷歌发布了 《MapReduce:Simplified Data Processing on Large Clusters》论文 在开源实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段
-
Map阶段,是在单机上进行的针对一小块数据的计算过程
-
Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备
-
Reduce过程,reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据
为什么shuffle对性能非常重要
Shuffle的过程中会产生大量的磁盘 IO、网络 IO、以及压缩、解压缩、序列化和反序列化的操作,这一系列的操作对性能都是一个很大的负担。
Sshuffle算子
Shuffle算子分类
Spark中会产生shuffle的算子大概可以分为4类
Spark中对shuffle的抽象
- 窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
- 宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖
算子内部的依赖关系
Shuffle Dependency构造 -Aggregator
- createCombiner:只有一个value的时候初始化方法
- mergeValue:合并一个value到Aggregator中
- mergeCombiners:合并两个Aggregator
Shuffle过程
Shuffle实现的发展历程
Hash Shuffle -写数据
每个partition会映射到一个独立的文件
Hash Shuffle -写数据优化
每个partition会映射到一个文件片段
Sort shuffle:写数据
每个task生成一个包含所有partition数据的文件
Sort shuffle:读数据
每个reduce task分别获取所有map task生成的属于自己的片段
Push Shuffle
为什么需要Push Shuffle
Avg IO size太小,造成了大量的随机IO,严重影响磁盘的吞吐 M * R次读请求,造成大量的网络联届,影响稳定性
Magnet实现原理
-
Spark driver组件,协调整体的shuffle操作
-
map任务的shuffle writer过程完成后,增加了一个额外的操作Push-merge,将数据复制一份推到远程shuffle服务上
-
magnet shuffle service是一个强化版的ESS.将隶属于同一个shuffle partition的block,会在远程传输到magnet后被merge到一个文件中
-
reduce任务从magnet shuffle service接收合并好的shuffle数据
Cloud Shuffle Service思想
Cloud Shuffle Service AQE
一个partition会最终对应到多个Epochfile,每个EPoch 目前设置时512MB