本文主要是介绍38 Sparkcore中的BlockManager,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
主要内容:
1. BlockManager 运行实例
2. BlockManager 原理流程图
37中的回顾:
首先讲解了Task内部具体执行的流程;然后介绍了Driver是如何对Executor处理后的Task执行的结果进行进一步的处理的。
从上一讲的内容可以看出在Shuffle过程中要读写数据(即上一个Stage的数据)时需要BlockManager的参与,因此为了了解Spark中程序的运行,掌握BlockManager部分的处理流程及方法十分重要。
一、BlockManager 运行实例
首先,这里通过实例来讲解BlockManger的运行过程。
当我们运行了Spark-shell时,可以从web控制台看见如下内容:
图38-1 web控制台信息
从图中可以发现Job的调度模式为FIFO,这是为了确保当前程序最快速最稳定的执行完成。
下面我们来看看日志信息:
图38-2 日志信息
1.注册BlockMangerMaster和MapOutputTracker
在Application启动时会实例化SparkContext(SparkEnv),并在其中注册Blockmanager以及MapOutputTracker。其中:
(1) BlockManagerMaster
对整个集群的Block数据进行管理,Block是Spark处理数据的基本单位,其与数据存储在哪里无关。具体注册过程见下列代码:
(2) MspOutputTakerMaster
主要用于跟踪所有的Mapper的输出的。
图38-3日志信息2
2. BlockManagerMasterEndpoint注册与管理
其本身是一个消息循环体,会负责通过远程消息通信的方式去管理所有的节点的BlockManager。
& 构造BlockmangerMaster时,其内部有个成员是BlockManagerMasterEndpoint。
BlockManagerMasterEndpoint是BlcokManagerMaster的一个成员,在BlockManagerMaster实例化时产生,并开始接收其他BlcokManager向它发送注册信息。
3.注册BlockManager
首先来看下相关日志信息:
图38-4日志信息3
每次启动一个ExecutorBackend都会实例化BlockManager,并通过远程通信的方式注册给BlockManagerMaster;但是实质上是Executor中的BlockManager在启动的时候注册给了Driver上的BlockManagerMasterEndpoint。
& ?这里的BlockManagerMaster需要做HA吗?
& 首先,BlockManagerMaster是Driver中一个普通的对象,在集群运行的时候,我们一般无法对一个对象作HA,但可以对进程作HA。那么,我们可以让Driver运行在集群中(集群模式)。这时,可以指定Supervise关键字,通过spark-submit启动Application。当Driver挂掉时,Master就可以将Driver恢复。
补充:与BlockManager相关的对象
(1)MemoryStore
是BlockManager中专门负责内存数据存储和读写的类。
(2)DiskStore
是BlockManager中专门负责基于磁盘的数据存储和读写的类。
BlockManager最重要的功能是存取数据块是由get和put这两个方法实现的。(可以分为远程的get/put和远程的get/put,BlockManager可以基于MemoryStore、DiskStore或者OffHeap(Tachyon Store))
(3)DiskBlockManager
管理logical Block与磁盘上的physical Block之间的映射关系并负责磁盘的文件的创建、读写等。
其实现代码如下:
二、从作业运行的角度来观察BlockManager
1.广播(BroadCast)
首先,在程序启动开始需要进行广播(包括一些广播变量,主要是一些在内存中已有的数据),这里的广播是在内存中进行的。所以就需要调用MemoryStore,并通过MomeryStore来存储广播变量。
可以为了更好的理解这一步操作,我们可以通过日志及源码来进一步详细了解。
图38-5日志信息4
2.Driver管理BlockManager
在Driver中通过BlockManagerInfo来管理集群中每个ExecutorBackend中的BlockManager中的元数据信息。
& BlockManagerInfo 其中有BlockManagerId(标明具体的BlockManger)。每个节点每启动一个ExecutorBackend都会相应的有(启动)一个BlockManager。这里的SlaveEndpoint用于BlockManagerMaster与Slave节点上的BlockManager进行通信的。
3.更新BlockManagerInfo信息
当改变了具体的ExecutorBackend上的Block信息后,就必须发消息给Driver中的BlockManagerMaster来更新相应的BlockManagerInfo的信息;
& Stage提交TaskSet会想利用MemoryStore存储广播变量。进而更新BlockManagerInfo。
4.从Driver中读取Block信息
当执行第二个Stage时,第二个Stage会向Driver中的MapOutputTrackerMasterEndpoint发消息会向Driver中的MapOutputTrackerMasterEndpoint发消息,请求上一个Stage中相应的输出。此时MapOutputTrackerMaster会把上一个Stage的输出数据的元数据信息发送给当前请求的Stage;
图38-5日志信息5 shuffle日志
& ?BlockManager与Yarn中nodeManager的区别:
& Yarn中的nodeManager管理的是当前节点的CUP与内存资源的,它是管理物理硬件资源;
& BlockManager管理的是以Block为基础的数据,它是管理数据的。
三、BlockManager运行原理图
__________________________________EOF_______________________________________________
这篇关于38 Sparkcore中的BlockManager的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!