38 Sparkcore中的BlockManager

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_25306771/article/details/52041081

主要内容:

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_______________________________________________

 

 

 

展开阅读全文

没有更多推荐了,返回首页