8.1 模块整体架构
Storage模块采用Master/Slave架构,Master负责整个Application的Block元数据信息的管理和维护;Slave负责将Block的更新等状态上报到Master,Master和Slave之间通过AKKA消息传递机制通信,Master与Slave之间并没有心跳检测而是间接通过Driver与Executor之间的心跳检测而来
Master的元数据信息管理与维护主要保存在BlockManagerMasterActor的三个数据结构中:
1)private valblockManagerInfo = new mutable.HashMap[BlockManagerId,BlockManagerInfo],保存BlockManagerId->BlockManagerInfo的映射,BlockManagerInfo保存Slave节点的内存使用情况、Block的状态、BlockManagerSlaveActor的Reference
2)private valblockManagerIdByExecutor=new mutable.HashMap[String,BlockManagerId]保存ExecutorID->BlockManagerId的映射
3)private valblockLocations=new JHashMap[BlockId,mutable.HashSet[BlockManagerId]],保存Block在哪些BlockManager上的HashMap,通过查询可知blockLocations可以找到某个Block所在的物理位置(HashSet说明该Block可能存在多个副本)
Slave的BlockManager创建后,需要向BlockManagerMasterActor发送RegisterBlockManager进行注册,master.registerBlockManager(blockManagerId,maxMemory,slaveActor)//参数分别为BlockManager标识,节点最大使用内存数,BlockManagerSlaveActor,利用blockManagerIdByExecutor把Slave信息保存在Master端
Driver端的实现:
SparkContext->SparkEnv->BlockManager->BlockManagerMaster转发请求至->BlockManagerMasterActor完成元数据管理和维护
Executor端的实现:
BlockManager->BlockManagerMaster持有Driver端的BlockManagerMasterActor的Reference,以此来完成Slave到Master的交互;除此之外BlockManager还拥有BlockManagerSlaveActor即该Actor的Reference会被上传到Master,Master会利用此Reference向Slave发送一些命令,比如删除Slave上的RDD、Shuffle相关的数据或者广播变量
8.1.2 源码组织结构
BlockManager提供读写Block的接口,BlockID格式是rdd_rddId_pa