这是我参与「第四届青训营 」笔记创作活动的的第6天
在大数据场景下,数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
Shuffle算子分类
createCombiner:只有一个value的时候初始化的方法 mergeValue:合并一个value到Aggregalor中 mergeCombiners:合并两个Aggregalor
Shuffle Handle的创建
Register Shuffle时做的最重要的事情是根据不同条件创建不同的shuffle Handle
Reader实现:网络时序图
使用基于netty的网络通信框架 位置信息记录在MapOutputTracker中 主要会发送两种类型的请求:OpenBlocks请求 Chunk请求或Stream请求
ESS作为一个存在于每个节点上的agent为所有Shuffle Reader提供服务,从而优化了Spark作业的资源利用率,MapTask在运行结束后可以正常退出
Shuffle优化使用的技术:Zero Copy
DMA:直接存储器存取,是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。
Shuffle倾斜优化
倾斜影响:作业运行时间变长;Task OOM导致作业失败 提高并行度:足够简单 只缓解,不根治 AQE根据shuffle文件统计数据自动检测倾斜数据,将那些倾斜的分区打散成小的子分区,然后各自进行join
Push Shuffle的实现
Magnet实现原理
bitmap:存储已merge的mapper id,防止重复merge position offset:如果本次block没有正常merge,可以恢复到上一个block的位置 currentMapId:标识当前正在append的block,保证不同mapper的block能依次append
Cloud Shuffle Service架构
一个Partition会最终对应到多个Epoch file