spark shuffle写操作——BypassMergeSortShuffleWriter

创建分区文件writer

每一个分区都生成一个临时文件,创建DiskBlockObjectWriter对象,放入partitionWriters

分区writer写入消息

遍历所有消息,每一条消息都使用分区器选择对应分区的writer然后写入

生成分区文件

将分区writer的数据flush,每个分区生成一个FlieSegment,保存在partitionWriterSegments

分区writer的commit

可以看到生成的fileSegment中file还是上面的分区临时文件

合并分区临时文件

遍历分区临时文件,获取对应的合并writer,将临时文件的数据写入到合并writer中

获取合并的writer

生成一个临时文件,多个reducer使用同一个临时文件。

每个分区都会生成一个LocalDiskShufflePartitionWriter

LocalDiskShufflePartitionWriter类核心方法有两个openStream、openChannelWrapper。

两个方法分别调用对应的init方法,返回PartitionWriterStream的stream对象和PartitionWriterChannel的channel对象。

PartitionWriterStream的write方法中使用outputBufferedFileStream,在initStream中可以看到outputBufferedFileStream使用的上面生成的临时文件outputTempFile。

PartitionWriterChannel的channel方法返回的是outputFileChannel,outputFileChannel在initChannel中使用的也是上面生成的临时文件outputTempFile。

这表明无论使用stream还是channel,最后都是写入临时文件outputTempFile中。



临时文件数据写入合并writer

writePartitionedDataWithChannel是使用channel的方式,调用copyFileStreamNIO

writePartitionedDataWithStream是使用stream的方式,调用copyStream

copyFileStreamNIO

可以看到使用了transferTo方法(零拷贝)

copyStream

先判断是否能使用transferTo,能的话就调copyFileStreamNIO用零拷贝的方式,不行的话就走普通的流复制

最终的分区文件提交

将最终的分区临时文件提交,生成对应的data文件和index文件。

可以看到是调用的IndexShuffleBlockResolver类的writeIndexFileAndCommit方法。

相关推荐
爱学习的小囧3 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
rADu REME4 小时前
探索Spring Cloud Config:构建高可用的配置中心
大数据·elasticsearch·搜索引擎
坚持就完事了4 小时前
Linux中的变量
linux·运维·服务器
handler014 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
Cat_Rocky4 小时前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志4 小时前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发
正点原子4 小时前
【正点原子Linux连载】第三章 U-Boot使用 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
xcbrand5 小时前
政府事业机构品牌策划公司找哪家
大数据·人工智能·python
Qbw20045 小时前
【Linux】进程地址空间
linux·c++
Giggle12186 小时前
上门维修预约小程序开发全流程:从核心功能设计到技术选型实践
大数据·个人开发·内容运营