shuffleBlockManager继承于Logging,参数为blockManager和shuffleManager。shuffle文件有三个特性:shuffleId,整个shuffle stage所具有的唯一Id;bucketId,输出的partition的Id;fileId,标志着这一组文件属于同一个shuffle,每个task在同一时间只有一个fileId,执行完成后fileId归还资源池。shuffle的状态由shuffleState类来描述,包含其相关的所有状态信息,包括:分配给该shuffle的fileGroup(已使用的和全部的两种);完成的mapTask的Id,这些mapTask是指shuffle所在executor上为它所需要的所有mapTask。

1、addCompleteMap():添加已经完成的、符合条件的mapTask至shuffleState。这个方法应该在基于sort的shuffle中使用,因为只有基于sort的shuffle才会在map完成后在单个文件内进行排序(并不是整个文件进行排序!)。

2、forMapTask():给定mapTask后,生成shuffleWriteGroup。map的结果写入文件,需要创建一个writers对BlockManager提供的block进行写操作。同时,在创建的shuffleWriteGroup中定义新的操作函数,releaseWriters,释放writers操作;getUnusedFileGroup,根据shuffleState获取未使用的FileGroup;newFileGroup,新建FileGroup,需要向BlockManager拉取文件信息,组成洗呢FileGroup。

3、getBlockLocation():给定shuffleBlockId,查找其物理文件所在的地址。这个方法只有在shuffle file允许consolidation时才能被使用,因为consolidation涉及到shuffle的相关文件的consolidation,必须根据shuffleBlockId查找物理文件。

4、removeShuffle()和removeShuffleBlocks():前者移除Shuffle相关的block、file和中间数据,后者不移除中间数据。

定义了一个ShuffleBlockManager的对象,该对象需要存储FileGroup所在的第一个block的Id,偏移位置等,能够快速获取Shuffle所需文件。

从MapOutputTracker到shuffleBlockManager阶段需要经过以下方面:

1、写入Block,相关文件为BlockObjectWriter.scala,负责将数据写入Block;

2、shuffle匹配Block中的数据,相关文件为BlockStoreShuffleFetcher.scala。

因此完整的路径为:

MapOutPutTracker:将Map的输出做负载均衡,因为file之间不平衡将导致文件传输的不平衡,与原来的shuffle读取file中的segment有区别。

BlockObjectWriter:将Map的输出写入block,原先的数据写入是严格区分segment然后压缩,新的方法是不用区分segment,方便解压缩数据后整个文件能够直接使用。

BlockStoreShuffleFetcher:按照shuffleId将数据块拼接到一个文件中,供worker拉取。

ShuffleBlockManager:拉取到文件后,获取相应的分块,然后进行Shuffle操作。

Spark源码学习1.8——ShuffleBlockManager.scala的更多相关文章

  1. Spark源码学习1.2——TaskSchedulerImpl.scala

    许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了. 这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是 ...

  2. Spark源码学习1.1——DAGScheduler.scala

    本文以Spark1.1.0版本为基础. 经过前一段时间的学习,基本上能够对Spark的工作流程有一个了解,但是具体的细节还是需要阅读源码,而且后续的科研过程中也肯定要修改源码的,所以最近开始Spark ...

  3. Spark源码学习1.6——Executor.scala

    Executor.scala 一.Executor类 首先判断本地性,获取slaves的host name(不是IP或者host: port),匹配运行环境为集群或者本地.如果不是本地执行,需要启动一 ...

  4. Spark源码学习1.5——BlockManager.scala

    一.BlockResult类 该类用来表示返回的匹配的block及其相关的参数.共有三个参数: data:Iterator [Any]. readMethod: DataReadMethod.Valu ...

  5. Spark源码学习1.4——MapOutputTracker.scala

    相关类:MapOutputTrackerMessage,GetMapOutputStatuses extends MapPutputTrackerMessage,StopMapOutputTracke ...

  6. Spark源码学习1.3——TaskSetManager.scala

    TaskSetManager.scala TaskSet是指一系列被提交的task,一般是代表特定的stage中丢失的partition.TaskSetManager通过一个TaskScheduler ...

  7. Spark源码学习1.7——Master.scala

    master第一步是加载系统定义的环境变量,如worker的超时时间.系统保留的Application数目等:第二步,加载worker的信 息,地址.id等:第三步,加载Application的信息, ...

  8. Spark源码学习2

    转自:http://www.cnblogs.com/hseagle/p/3673123.html 在源码阅读时,需要重点把握以下两大主线. 静态view 即 RDD, transformation a ...

  9. spark源码学习-withScope

     withScope是最近的发现版中新增加的一个模块,它是用来做DAG可视化的(DAG visualization on SparkUI) 以前的sparkUI中只有stage的执行情况,也就是说我们 ...

随机推荐

  1. Python之路 day2 字符编码及转换

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import sys print("sys default encodin ...

  2. JQuery实现table分页

    1.直接贴代码: ; //每页显示的记录条数 ; //显示第curPage页 var len; //总行数 var page; //总页数 $(function(){ len =$(; //去掉表头 ...

  3. MySQL 解压包 安装

    1.解压 2.配置mysql bin的环境变量 3.配置my-defalue.ini 配置文件 或自己建立一个my.ini文件 [mysqld] basedir=F:\mysql\mysql-5.6. ...

  4. 不在折腾----hadoop-2.4.1完全分布式集群搭建

    前言 * hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA.YARN等.最新的hadoop-2.4.1又增加了YARN HA * 注意:apache提供的hadoop-2.4 ...

  5. SPSS数据分析—Probit回归模型

    Probit含义为概率单位,和Logistic回归一样,Probit回归也用于因变量为分类变量的情况,通常情况下,两种回归方法的结果非常接近,但是由于Probit回归的结果解释起来比较抽象不易理解,因 ...

  6. 删除Kafka的topic

    刚接触Kafka,开始认为删除一个topic只是运行一下Kafka-topic.sh的delete命令就行了,但是,事实却不是这样,会出现两种情况:(1) 如果topic没有使用过即没有传输过消息,可 ...

  7. 很重要的vue的生命周期

  8. 使用COALESCE时注意left join为null的情况

    1.使用COALESCE时,用到group by with cube,如果之前两个表left join时,有数据为null,就会使得查出的数据主键不唯一 例如: select COALESCE (c. ...

  9. hexo 本地local4000打不开解决方法

    错误:Cannot GET /spadesq.github.io/ (注:spadesq.github.io是原来放hexo文件夹的名字) 由于我后来把hexo文件夹搬迁到别处,但我发现打开本地,地址 ...

  10. SpringMVC流程

    Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherServlet对请求URL进行解析 ...