这是我参与「第四届青训营 」笔记创作活动的的第6天
课堂内容
shuffle概述
在开源的MapReduce中有三个过程:Map,Shuffle,Reduce
Map:归类
Shuffle:移动
Reduce:计数
Shuffle算子
分类
算子之间的关系
Shuffle Dependency的构造
第一个是【K,V】对;第二个是给定K的分区;第三个是一个二进制的数据流和对象的映射,第四个是用来排序的,第五个是相当于预聚合类似的东西,第六个是一个判断的东西\
- 两个具体的过程:
Shuffle过程
发展历程
- Hash Shuffle:主要就是Map Task到Aggregator进行移动,然后写成文件File。每一个partition对应一个独立的文件。这样会生成M*R个文件,就太多了。我们可以优化成每一个partition对应一个文件集/文件片段。
- Sort shuffle:每个task生成一个包含所以partition的数据文件。当File中数据满了就sort排一下序,就好了。
- 读数据:读他对应的部分就行。
- ShuffleHandle的建立
BypassMergeShuffleWriter:对应hash,适用于partition数量不能太多。
UnsafeShuffleWriter:应用堆外内存所以Unsafe,Long Array用来排序partition的一个功能。不能反序列化,并且partition不能移动。
sortshuffleWriter:支持combine,支持反序列,堆内内存。
- shufflehandle和shuffleWriter的关系
- Reader的实现:主要是两种请求OpenBlocks请求(本地数据),Chunk请求和stream请求(远程的数据)
- ShuffleBlockFetchIterator:好像是上面两种的一个集合,都可以做本地的和远程的。
shuffle优化
- zero copy和netty zero copy
过程优点
- broadcast:代替jion
- MapSide预聚合
- 参数优化:下面是各种参数
- 倾斜优化
- Shewjion:优化AQE
Push Shuffle
需要push shuffle的原因:第一Avg IOsize太小,造成了大量的随机IO,严重影响磁盘的吞吐,第二M*R次读请求,造成大量的网络连接,影响稳定性。
这是各个公司push shuffle的实现,下面我们介绍两个具体的实现:
- Magnet和Cloud
你可以理解为他在写完一份本地数据后向远端push一份一样的数据Merge到一个文件里
这三个是Merge的细节
这些是Magnet的优点:可靠性的体现
cloud的架构:主要特点CSS Master
前面是写入,后面是读取。写两遍,有一个错误再写两遍,直到没错。读取的时候会用Mapld/Attemptld/Batch去重。
AQE中partition划分一个大文件的规定:512MB