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方法。

相关推荐
t5y226 小时前
【Linux】定时任务调度
linux·服务器
HY小海7 小时前
【Linux】进程概念
linux·运维·服务器
王八八。7 小时前
linux后台java、postSQL部署命令
java·linux·运维
瑞熙贝通实验室综合管理平台8 小时前
实验动物管理系统|以痛点为核心 构建动物房数字化管理新体系
linux
黎阳之光9 小时前
黎阳之光:以视频孪生重构智慧防火,打造“天空地人智”一体化森林防火新范式
大数据·运维·人工智能·物联网·安全
Daydream.V10 小时前
Python Flask超全入门实战教程|从零基础到项目部署
大数据·python·flask
黄筱筱筱筱筱筱筱10 小时前
LINUX-防火墙
linux·服务器·网络
сокол10 小时前
【网安-Web渗透测试-靶场系列】AWD-Platform(ctf-hub)
linux·服务器·ubuntu·网络安全·docker
utf8mb4安全女神11 小时前
Linux系统服务相关命令【定时任务设置】【任务进程管理】【防火墙区域应用】
linux·运维·服务器
SmartBrain13 小时前
AI全栈开发(SDD):慢病管理系统工程级设计
java·大数据·开发语言·人工智能·架构·aigc