spark2.x-BlockManager

多少blocks存储 提供不同的方法去读取基础块数据
调用者应当调用dispose 当他们处理完block

BlockManager 运行實例

这里写图片描述

这里写图片描述

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

从 Job 运行的角度来观察BlockManager

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

BlockManager 源码解析

BlockManager 会运行在 driver 和 Executor 上面,

在 driver 上面的 BlockManager 是负责管理整个集群所有 Executor 中的 BlockManager,BlockManager 本身也是 Master-Slave 结构的,

所谓Master-Slave 结构就是一切的调度和工作都是由 Master 去触发的,Slave本身就是专注于干活的,而 Executor 在启动的时候,一定会实例化 BlockManager。

BlockManager主要提供了读取和写数据的接口,可以从本地或者是远程读取和写数据,读写数据可以基于内存、磁盘或者是堆外空间 (OffHeap)。如果想使用 BlockManager 的话,必须调用 initialize 方法。程序进行 Shuffle 的时候是通过 BlockManager 去管理的。

基于应用程序的 AppId 去初始化 BlockManager,这个 initialize 方法也会启动 BlockTransferService 和 ShuffleClient,同时注册 BlockManagerMaster,启动 BlockManagerWorker endpoint,当 Executor 实例化的时候会通过 BlockManager.initialize 来实例化 Executor 上的 BlockManager 并且会创建 BlockManagerSlaveEndpoint 这个消息循环体来接受 Driver 中的 BlockManagerMaster 发过来的指令,例如删除 Block 的指令。 当 BlockManagerSlaveEndpoint 实例化后,Executor 上的 BlockManager 需要向 Driver 上的 BlockManagerMasterEndpoint 注册

发送消息到 BlockManagerSlaveEndpoint

BlockManagerMasterEndpoint 接受到 Executor 上的注册信息并进行处理,每一个 BlockManager 都会对应一个 BlockManagerInfo,然后通过 executorId 看看能不能找到 BlockManagerId,BlockManagerMaster 包含了集群中整个 BlockManager 注册的信息。经过了这几个步骤后完成了注册的工作,这跟 Spark-Shell 启动时的日志信息是一致的。

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

Driver:
BlockManager 每个节点上 都有BlockManager
DiskStore
读写磁盘上的数据
MemoryStore
读写内存中的数据
BlockMangerWorker
对远程其他节点的BlockManager数据的读写

如果persist()指定了要replica
会使用BlockManagerWorker将数据replicate一份到其他节点的BlockManager
ConnectionManager 网络连接操作
BlockMannager到远程其他节点的BlockManager的网络连接
之前分析的shuffle Read操作
很有可能要拉取的数据
在本地没有
那么此时会到远程有数据的节点上的BlockManager拉取需要的数据
从BlockManager读取数据时
shuffle Read 操作 如果能从本地读取数据 就从利用DiskStore或者MemoryStore从本地读取数据
本地没有数据 会用ConnectionManager与有数据的BlockManager建立连接
然后用BlockManagerWorker从远程BlockManager读取数据

BlockManager 是一个嵌入在 spark 中的 key-value型分布式存储系统,是为 spark 量身打造的,
BlockManager 在一个 spark 应用中作为一个本地缓存运行在所有的节点上, 包括所有 driver 和 executor上。
BlockManager 对本地和远程提供一致的 get 和set 数据块接口,

BlockManager 本身使用不同的存储方式来存储这些数据, 包括 memory, disk, off-heap。

=============================================================================

参考资料:
http://www.fmi.com.cn/index.php?m=content&c=index&a=show&catid=9&id=618006

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值