BlockManager分析

BlockManager分析

  BlockManager 是一个嵌入在 spark 中的 key-value型分布式存储系统。它分为master和slave。

        Driver 端 是 BlockManager master;Executor 节点 是 BlockManager slave;

        BlockManager 在一个 spark 应用中作为一个本地缓存运行在所有的节点上。BlockManager 对本地和远程提供一致的 get 和set 数据块接口,BlockManager 本身使用不同的存储方式来存储这些数据, 包括 memory(内存), disk(磁盘), off-heap(堆外)。

存储的block信息是什么?

在spark的存储内存中存取数据的最小单位是block,所有的操作都是以block为单位进行的。

如当在spark上执行cache时,会将RDD数据持久到 存储模块中,这时存进去的就是block。

BlockManager分析 

流程说明:

1)在 Application 启动的时候会在 spark-env.sh 中注册 BlockMangerMaster。

            BlockManagerMaster:对整个集群的 Block 数据进行管理;

2)每个启动一个 Executor 都会实例化 BlockManagerSlave 并通过远程通信的方式注册给 BlockMangerMaster;

3)BlockManagerSlave由 4部分组成:

            MemoryStore:负责对内存上的数据进行存储和读写;

            DiskStore:负责对磁盘上的数据进行存储和读写;

            BlockTransferService:负责与远程其他Executor 的BlockManager建立网络连接;

            BlockManagerWorker负责对远程其他Executor的BlockManager的数据进行读写;

4)当Executor 的BlockManager 执行了增删改操作,那就必须将 block 的 blockStatus 上报给Driver端的BlockManagerMaster,BlockManagerMaster 内部的BlockManagerMasterEndPoint 内维护了 元数据信息的映射。通过Map、Set结构,很容易维护 增加、更新、删除元数据,进而达到维护元数据的功能。

5)block 写操作

        本地写:

        当Spark作业进行持久化或Shuffle等操作的时候,会触发BlockManager进行写操作;比如执行persist操作的时候,缓存级别设置的是 MEMORY_AND_DISK,就会触发数据持久化的操作,数据会优先进入到内存,当内存不足,会将数据持久化到磁盘。

        远程写:

        如果指定了replicate(带副本的缓存级别),那么数据会通过BlockTransferService复制一份到其他节点上去。

 

6)block 读操作

        本地读:

        当Spark作业的某个算子触发读取数据的操作,首先,会在该算子所在的BlockManager读取数据;

        远程读:

        如果本地没有数据,需要从 driver上获取到 Block的真正存储位置,通过BlockTransferService 到远程有数据的那个Executor 里,找到那个Executor 的 BlockManager 来拉取数据。

BlockManager

BlockManager典型的几个应用场景如下:

1)spark shuffle过程的数据就是通过blockManager来存储的。

2)spark broadcast 将task调度到多个executor的时候,broadCast 底层使用的数据存储就是blockManager。

3)对一个rdd进行cache的时候,cache的数据就是通过blockManager来存放的。