前言

再上一篇文章 spark shuffle的写操作之准备工作 中,主要介绍了 spark shuffle的准备工作,本篇文章主要介绍spark shuffle使用BypassMergeSortShuffleWriter写数据详细细节。

在本篇文章中如果有不了解的术语,也可以参照 spark shuffle的写操作之准备工作  做进一步了解。

这种shuffle写数据的方式是最简单的,spark计划在以后会移除这种shuffle机制。

先上源码,后解释:

流程如下:

map数据根据分区函数写入分区文件

如果没有数据要写,那么数据文件为空,索引文件中各个segment的大小为0,返回初始化的MapStatus。

如果有数据要写到各个reducer的文件中,首先初始化序列化工具实例,遍历初始化各个partition的partitionWriter数组中的DiskBlockObjectWriter对象,初始化各个partition的FileSegment数组。

然后遍历每一个要写入的记录值,并且取出记录的key值,根据Partitioner的getPartition函数确定其reduce到的目标分区索引,然后根据计算出的索引确定负责写数据的DiskBlockObjectWriter对象,然后根据该对象将键值对写入到临时分区文件。

当每一个要写入的记录值遍历操作完毕,遍历每一个分区,将该分区对应的partitionWriter执行commitAndGet操作,返回该分区的FileSegment对象。

其依赖方法commitAndGet源码如下:

至此,大多数情况下,reduce的每一个partition的数据有被写入到一个单独的文件。明明是FileSegment,为什么是单独的文件呢?原因就在于DiskBlockManager返回的临时ShuffleBlockId是不重复的,org.apache.spark.storage.DiskBlockManager#createTempShuffleBlock源码如下:

又因为创建临时文件,只是创建临时文件的句柄,此时对应的物理文件,并不存在,所以,这个方法不能保证创建的临时文件不重复。所以多个partition数据写入到一个临时文件的概率还是有的,只不过是小概率事件。

最后小的分区文件会被合并为一个文件。

首先调用ShuffleBlockResolver(它是IndexShuffleBlockResolver实例)的getDataFile方法获取数据文件的句柄File对象,org.apache.spark.util.Utils的tempFileWith获取临时文件,org.apache.spark.util.Utils#tempFileWith源码如下,即获得一个带uuid后缀的文件:

合并分区文件

最后调用org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter的writePartitionedFile方法将多个小文件合并为一个大文件并返回包含每一个partition

对应的文件段的大小的数组,源码如下:

更新索引文件

最后更新索引文件,给数据文件重命名后整个写过程就彻底结束了,源码不再做过多解释,在  spark shuffle的写操作之准备工作 中 IndexShuffleBlockResolver类中有说明。

总结

BypassMergeSortShuffleWriter是基于文件做的分区,没有sort操作,最后分区数据被写入一个完整文件,并且有一个索引文件记录文件中每一个分区对应的FileSegment的大小。这种设计是比较朴素的,也很简单,易实现。

spark shuffle写操作三部曲之BypassMergeSortShuffleWriter的更多相关文章

  1. spark shuffle写操作三部曲之UnsafeShuffleWriter

    前言 在前两篇文章 spark shuffle的写操作之准备工作 中引出了spark shuffle的三种实现,spark shuffle写操作三部曲之BypassMergeSortShuffleWr ...

  2. spark shuffle写操作之SortShuffleWriter

    提出问题 1. spark shuffle的预聚合操作是如何做的,其中底层的数据结构是什么?在数据写入到内存中有预聚合,在读溢出文件合并到最终的文件时是否也有预聚合操作? 2. shuffle数据的排 ...

  3. spark shuffle读操作

    提出问题 1. shuffle过程的数据是如何传输过来的,是按文件来传输,还是只传输该reduce对应在文件中的那部分数据? 2. shuffle读过程是否有溢出操作?是如何处理的? 3. shuff ...

  4. spark shuffle的写操作之准备工作

    前言 在前三篇文章中,spark 源码分析之十九 -- DAG的生成和Stage的划分 剖析了DAG的构建和Stage的划分,spark 源码分析之二十 -- Stage的提交 剖析了TaskSet任 ...

  5. Spark Shuffle原理、Shuffle操作问题解决和参数调优

    摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...

  6. Spark Shuffle(一)ShuffleWrite:Executor如何将Shuffle的结果进行归并写到数据文件中去(转载)

    转载自:https://blog.csdn.net/raintungli/article/details/70807376 当Executor进行reduce运算的时候,生成运算结果的临时Shuffl ...

  7. Spark shuffle详细过程

    有许多场景下,我们需要进行跨服务器的数据整合,比如两个表之间,通过Id进行join操作,你必须确保所有具有相同id的数据整合到相同的块文件中.那么我们先说一下mapreduce的shuffle过程. ...

  8. Spark Shuffle(ExternalSorter)

    1.Shuffle流程 spark的shuffle过程如下图所示,和mapreduce中的类似,但在spark2.0及之后的版本中只存在SortShuffleManager而将原来的HashShuff ...

  9. 浅析 Spark Shuffle 内存使用

    在使用 Spark 进行计算时,我们经常会碰到作业 (Job) Out Of Memory(OOM) 的情况,而且很大一部分情况是发生在 Shuffle 阶段.那么在 Spark Shuffle 中具 ...

随机推荐

  1. Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制

    在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...

  2. Cisco packet tracer下dhcp的配置的vlan的应用

    话不多说,先上拓扑图. pc0和pc1分别接在三层交换机的F0/1.F0/2接口,ser接在F0/24接口,用ser用作dhcp的服务器. 0x01:配置server0 先配置server的IP地址. ...

  3. 前端摸爬滚打之路(一)之 JavaScript 基础

    前言:这是我第一次在博客上记录自己的前端学习过程,以往都是在桌面右侧开个 onenote 小窗,记录自己在学习过程中获得的知识.通常都是记录的满满当当,然后心满意足的关闭窗口,但是记录不代表学会.这些 ...

  4. C++ 洛谷 P2657 [SCOI2009]windy数 题解

    P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...

  5. 计算广告之CTR预估-FNN模型解析

    原论文:Deep learning over multi-field categorical data 地址:https://arxiv.org/pdf/1601.02376.pdf 一.问题由来 基 ...

  6. 在SpringBoot中使用RabbitMQ

    目录 RabbitMQ简介 RabbitMQ在CentOS上安装 配置文件 实践 概述 Demo 遇到的BUG 启动异常 无法自动创建队列 RabbitMQ简介 wikipedia RabbitMQ在 ...

  7. 分享常见的HTTP状态码

    本内容摘抄自RUNOOB.COM 当浏览一个网页时,浏览器会向网页所在服务器发出请求.当浏览器确定接收并显示网页之前,此网页所在的服务器会返回一个含有HTTP状态码(HTTP Status Code) ...

  8. centos7安装hadoop完全分布式集群

    groupadd test             //新建test工作组 useradd -g test phpq        //新建phpq用户并增加到test工作组 userdel 选项 用 ...

  9. scrapy基础知识之将item 通过pipeline保存数据到mysql mongoDB:

    pipelines.py class xxPipeline(object): def process_item(self, item, spider): con=pymysql.connect(hos ...

  10. Java实现异步调用

    一.创建线程 @Test public void test0() throws Exception { System.out.println("main函数开始执行"); Thre ...