本课主题

  • BlockManager 运行實例
  • BlockManager 原理流程图
  • BlockManager 源码解析

引言

BlockManager 是管理整个Spark运行时的数据读写的,当然也包含数据存储本身,在这个基础之上进行读写操作,由于 Spark 本身是分布式的,所以 BlockManager 也是分布式的,

BlockManager 原理流程图

[下图是 BlockManager 原理流程图]

BlockManager 运行實例

从 Application 启动的角度来观察BlockManager

  1. 在 Application 启动的时候会在 spark-env.sh 中注册 BlockMangerMaster 以及 MapOutputTracker,其中:

    • BlockManagerMaster:对整集群的 Block 数据进行管理;
    • MapOutputTracker:跟踪所有的 Mapper 的输出;
  2. BlockManagerMasterEndpoint 本身是一个消息体,会负责通过远程消息通信的方式去管理所有节点的 BlockManager;
  3. 每个启动一个 ExecutorBackend 都会实例化 BlockManager 并通过远程通信的方式注册给 BlockMangerMaster;实际上是 Executor 中的 BlockManager 注册给 Driver 上的 BlockMangerMasterEndpoiont;(BlockManger 是 Driver 中的一个普通的对象而己,所以无法直接对一个对象做HA)
  4. MemoryStore 是 BlockManager 中专门负责内存数据存储和读写的类,MemoryStore 是以 一个又一个 Block 为单位的
  5. DiskStore 是 BlockManager 中专门负责磁盘数据存储和读写的类;
  6. DiskBlockManager:管理 LogicalBlock 与 Disk 上的 PhysicalBlock 之间的映射关联并负责磁盘的文件的创建,读写等;

[下图是 Spark-Shell 启动时的日志信息-1]


[下图是 Spark-Shell 启动时的日志信息-2]

从 Job 运行的角度来观察BlockManager

  1. 首先通过 MemoryStore 来存储广播变量
  2. 在 Driver 中是通过 BlockManagerInfo 来管理集群中每个 ExecutorBackend 中的 BlockManager 中的元数据信息的;
  3. 当改变了具体的 ExecutorBackend 上的 Block 的信息后就必需发消息给 Driver 中的 BlockManagerMaster 来更新相应的 BlockManagerInfo 的信息
  4. 当执行第二个 Stage 之后,第二个 Stage 会向 Driver 中的 MapOutputTrackerMasterEndpoint 发消息请求上一個 Stage 中相应的输出,此時 MapOutputTrackerMaster 会把上一個 Stage 的输出数据的元数据信息发送给当前请求的 Stage

[下图是 Spark-Shell 作业运行时的日志信息-1]

[下图是 Spark-Shell 作业运行时的日志信息-2]

BlockManager 源码解析

  1. BlockManager 会运行在 driver 和 Executor 上面,在 driver 上面的 BlockManager 是负责管理整个集群所有 Executor 中的 BlockManager,BlockManager 本身也是 Master-Slave 结构的,所谓Master-Slave 结构就是一切的调度和工作都是由 Master 去触发的,Slave本身就是专注于干活的,而 Executor 在启动的时候,一定会实例化 BlockManager。
    [下图是 Executor.scala 中调用 blockManager.initialize 方法的实现]

    [下图是 SparkContext.scala 中调用 blockManager.initialize 方法的实现]

    BlockManager主要提供了读取和写数据的接口,可以从本地或者是远程读取和写数据,读写数据可以基于内存、磁盘或者是堆外空间 (OffHeap)。如果想使用 BlockManager 的话,必须调用 initialize 方法。程序进行 Shuffle 的时候是通过 BlockManager 去管理的。
    [下图是 BlockManager.scala 中 BlockManager 类]
  2. 基于应用程序的 AppId 去初始化 BlockManager,这个 initialize 方法也会启动 BlockTransferService 和 ShuffleClient,同时注册 BlockManagerMaster,启动 BlockManagerWorker endpoint,当 Executor 实例化的时候会通过 BlockManager.initialize 来实例化 Executor 上的 BlockManager 并且会创建 BlockManagerSlaveEndpoint 这个消息循环体来接受 Driver 中的 BlockManagerMaster 发过来的指令,例如删除 Block 的指令。 当 BlockManagerSlaveEndpoint 实例化后,Executor 上的 BlockManager 需要向 Driver 上的 BlockManagerMasterEndpoint 注册
    [下图是 BlockManager.scala 中 initialize 方法]

    [下图是 BlockManager.scala 中 slaveEndpoint 变量]

    [下图是 BlockManagerMaster.scala 中 registerBlockManager 方法]

    [下图是 BlockManagerMessage.scala 中 RegisterBlockManager case class]
  3. 发送消息到 BlockManagerSlaveEndpoint
    [下图是 BlockManagerSlaveEndpoint.scala 中 reveiceAndReply 方法]
  4. BlockManagerMasterEndpoint 接受到 Executor 上的注册信息并进行处理,每一个 BlockManager 都会对应一个 BlockManagerInfo,然后通过 executorId 看看能不能找到 BlockManagerId,BlockManagerMaster 包含了集群中整个 BlockManager 注册的信息。经过了这几个步骤后完成了注册的工作,这跟 Spark-Shell 启动时的日志信息是一致的。
    [下图是 BlockManagerMasterEndpoint.scala 中 reveiceAndReply 方法]

    [下图是 BlockManagerMasterEndpoint.scala 中 register 方法]

    [下图是 BlockManagerMasterEndpoint.scala 中 blockManagerInfo 数据结构]

    [下图是 BlockManagerMasterEndpoint.scala 中 removeExecutor 方法]

    [下图是 BlockManagerMasterEndpoint.scala 中 removeBlockManager 方法]

  5. BlockManagerMaster 只有一个 dropFromMemory 是指当我们内存不够的话,我们尝试释放一些内存给要使用的应用程序。
  6. 当注册本身没有问题之后接下来的事情就把相关的功能完成

參考資料

资料来源来至 DT大数据梦工厂 大数据传奇行动 
第38课:BlockManager架构原理、运行流程图和源码解密
第39课:BlockManager解密进阶:BlockManager初始化和注册解密、BlockManagerMaster工作解密、BlockTransferService解密、本地数据读写解密、远程数据读写解密

Spark源码图片取自于 Spark 1.6.0版本

[Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密的更多相关文章

  1. [Spark内核] 第37课:Task执行内幕与结果处理解密

    本课主题 Task执行内幕与结果处理解密 引言 这一章我们主要关心的是 Task 是怎样被计算的以及结果是怎么被处理的 了解 Task 是怎样被计算的以及结果是怎么被处理的 Task 执行原理流程图 ...

  2. [Spark内核] 第40课:CacheManager彻底解密:CacheManager运行原理流程图和源码详解

    本课主题 CacheManager 运行原理图 CacheManager 源码解析 CacheManager 运行原理图 [下图是CacheManager的运行原理图] 首先 RDD 是通过 iter ...

  3. [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等

    本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...

  4. [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕

    本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...

  5. Spark Streaming从Flume Poll数据案例实战和内幕源码解密

    本节课分成二部分讲解: 一.Spark Streaming on Polling from Flume实战 二.Spark Streaming on Polling from Flume源码 第一部分 ...

  6. [Spark内核] 第28课:Spark天堂之门解密

    本課主題 什么是 Spark 的天堂之门 Spark 天堂之门到底在那里 Spark 天堂之门源码鉴赏 引言 我说的 Spark 天堂之门就是SparkContext,这篇文章会从 SparkCont ...

  7. [Spark内核] 第29课:Master HA彻底解密

    本课主题 Master HA 解析 Master HA 解析源码分享 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... Master HA 解析 生产环境下一般 ...

  8. [Spark内核] 第30课:Master的注册机制和状态管理解密

    本課主題 Master 接收 Worker, Driver, Application Master 处理 Driver 狀态变换 Master 处理 Executor 狀态变换 [引言部份:你希望读者 ...

  9. [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结

    本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...

随机推荐

  1. Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. YII进行数据增删改查分析

    关于模型部分參考http://blog.csdn.net/buyingfei8888/article/details/40208729 控制器部分: <?php class GoodsContr ...

  3. 一行代码搞定ThoughtWorks面试题

    今天在微博看到一道有趣的题目.作为python的脑残粉,自然手痒. 题目在这里. FizzBuzzWhizz 你是一名体育老师.在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课 ...

  4. HDU 4193 Non-negative Partial Sums(想法题,单调队列)

    HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...

  5. Vue.js 基本语法

    插值 Html 使用 v-html 指令用于输出 html 代码: <div id="app"> <div v-html="message"& ...

  6. angular自定义分页组件(实用)

    功能描述:分页,点击按钮或者下一页获取分页接口,同时active到对应页码. html模块: <page page-count="totalPage" on-click-pa ...

  7. mysql与服务器之间的编码问题

    1.之前在练习一个java web的项目时,mysql的编码设置正确,服务器的编码也设置正确,但向mysql中存储数据时,就会出现乱码问题,后来发现是mysql与服务器之间的编码设置问题,以下是mys ...

  8. 前后端分离ueditor富文本编辑器的使用-Java版本

    最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...

  9. ATL环境:设置父窗口激活属性

    设置窗口激活属性:窗口A->B->C,这里设置在C对话框显示时A和B都不能操作 LRESULT sindykTools::AttrPOIDlg::OnBatchCreateSubPoint ...

  10. socket编程部分API

    以TCP协议为例,UNIX的相关API int socket(int domain , int type , int protocol); 根据指定的地址族,数据类型,协议来分配一个socket的描述 ...