这是我参与「第四届青训营 」笔记创作活动的的第2天
今天的笔记主要分为四个部分:
一、Shuffle概述
二、Shuffle算子
三、Shuffle过程
四、Push Shuffle
一、Shuffle概述
MapReduce概述
在开源是实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段。
其中Map阶段是在单机上进行的针对一小块数据的计算过程。
Shuffle阶段,在Map阶段的基础之上进行数据移动,为后续的reduce阶段做准备。
Reduce阶段是对移动后的数据进行处理,依然是在单机上处理一小份数据。
为什么Shuffle对性能非常重要?
- M*R次网络连接
- 大量的数据移动
- 数据丢失风险
- 可能存在大量的排序操作
- 大量的数据序列化、反序列化操作
- 数据压缩
二、Shuffle算子
Spark中会产生shuffle的算子大概可以分为4类:
为什么需要Shuffle?
在分布式计算框架中,数据本地化是一个很重要的考虑,即计算需要被分发到数据所在的位置,从而减少数据的移动,提高运行效率。
Map-Reduce的输入数据通常是HDFS中的文件,所以数据本地化要求map任务尽量被调度到保存了输入文件的节点执行。但是,有一些计算逻辑是无法简单地获取本地数据的,reduce的逻辑都是如此。对于reduce来说,处理函数的输入是key相同的所有value,但是这些value所在的数据集(即map的输出)位于不同的节点上,因此需要对map的输出进行重新组织,使得同样的key进入相同的reducer。 shuffle移动了大量的数据,对计算、内存、网络和磁盘都有巨大的消耗,因此,只有确实需要shuffle的地方才应该进行shuffle,否则尽可能避免shuffle。
三、Shuffle过程
Shuffle实现的发展过程:
1.Hash Shuffle-写数据
每个partition会映射到一个独立的文件
2.Hash Shuffle-写数据优化
每个partition会映射到一个文件片段
3.Shuffle-读数据
每个reduce task分别获取所有map task生成的属于自己的片段
4.Shuffle过程的触发流程
5.Shuffle Handle的创建
Register Shuffle时做的最重要的事情是根据不同条件创造不同的Shuffl Handle
6.Shuffle Handle与Shuffle Writer的对应关系
7.Writer实现-BypassMergeShuffleWriter
-不需要排序,节省时间
-写操作的时候会打开大量的文件
-类似于Hash Shuff
UnsafeShuffleWriter
-只根据Partition排序Long Array
-数据不移动
SortShuffleWriter
-支持combine
-需要combine时,使用partitionedAppendOnlyMap,本质是个HashTable
-不需要combine时PartitionedPairBuffer本质是个array
8.Reader实现-网络时序图
-使用基于netty的网络通信框架
-位置信息记录在MapOutputTracker中
-主要会发送两种类型的请求:OpenBlocks和Chunk或Stream请求
9.Shuffle优化使用的技术:Netty Zero Copy
-可堆外内存,避免JVM堆内存到对堆外内存的数据拷贝
-CompositeByteBuf、Unpooled.wrappedBuffer、ByteBuf.slice,可以合并、包装、切分数组,避免发生内存拷贝
-Netty使用FileRegion实现文件传输,FileRegion底层封装了FileChannel#TransferTo()方法,可以将文件缓冲区的数据直接传输到目标Channel,避免内核缓冲区和用户态缓冲区之间的数据拷贝
10.Spark AQE Skew Join
AQE根据shuffle文件统计数据自动检测倾斜数据,将那些倾斜的分区打散成小的分子区,然后各自进行join
四、Push Shuffle
1.为什么需要Push Shuff?
-Avg IO size太小,造成了大量的随机IO,严重影响磁盘的吞吐
-M*R次请求,造成大量的网络连接,影像稳定性
2.Magnet实现原理
-Spark driver组件,协调整体的shuffle操作
-map任务的shuffle writer过程完成后,增加了一个额外的操作push-merge,将数据复制一份推到远程shuffle服务上
-magnet shuffle service是一个强化版的ESS。将隶属于同一个shuffle partition的block,会在远程传输到magnet后被merge到一个文件中
-reduce任务从magnet shuffle service接收合并号的shuffle数据
3.Cloud Shuffle Service思想
4.Cloud Shuffle Service架构
-Zookeeper WorkerList[服务发现]
-CSS Worker[Partitions/Disk|Hdfs]
-Spark Driver[集成启动 CSS Master]
-CSS Master[Shuffle规划/统计]
-CSS ShuffleClient[Writer/Read]
-Spark Executor[Mapper+Reducer]