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

相关推荐
完美世界的一天10 分钟前
ES 面试题系列「三」
大数据·elasticsearch·搜索引擎·面试·全文检索
卡戎-caryon34 分钟前
【MySQL】07.表内容的操作
linux·网络·数据库·mysql·存储引擎
MZWeiei1 小时前
Flume之选择器:复制和多路复用(比喻化理解
大数据·flume
又逢乱世2 小时前
清除 Ubuntu 磁盘空间
linux·运维·服务器
光仔December3 小时前
【Elasticsearch入门到落地】13、DSL查询详解:分类、语法与实战场景
大数据·elasticsearch·搜索引擎·全文检索·dsl语法
张国荣家的弟弟3 小时前
为何在VMware中清理CentOS虚拟机后,本地磁盘空间未减少的问题解决
linux·运维·centos
甘北3 小时前
docker commit除了提交容器成镜像,还能搞什么之修改cmd命令
linux·运维·docker
吐泡泡_4 小时前
动静态库--
linux
Christo34 小时前
SIAM-2007《k-means++: The Advantages of Careful Seeding》
大数据·人工智能·算法·机器学习·支持向量机·kmeans
努力学习的小廉4 小时前
深入了解linux系统—— 操作系统的路径缓冲与链接机制
android·linux·服务器