BlockManagerMaster的作用是对存在于Executor或Driver上的BlockManager进行统一管理。Executor与Driver关于BlockManager的交互都依赖于BlockManagerMaster,比如Executor需要向Driver发送注册BlockManager、更新Executor上Block的最新信息、询问所需要Block目前所在的位置及当Executor运行结束需要将此Executor移除等。但是Driver与Executor却位于不同机器中,该怎么实现呢?
在Spark执行环境一节中有介绍过,Driver上的BlockManagerMaster会实例化并且注册BlockManagerMasterEndpoint。无论是Driver还是Executor,它们的BlockManagerMaster的driverEndpoint属性都将持有BlockManagerMasterEndpoint的RpcEndpiointRef。无论是Driver还是Executor,每个BlockManager都拥有自己的BlockManagerSlaveEndpoint,且BlockManager的slaveEndpoint属性保存着各自BlockManagerSlaveEndpoint的RpcEndpointRef。BlockManagerMaster负责发送消息,BlockManagerMasterEndpoint负责消息的接收与处理,BlockManagerSlaveEndpoint则接收BlockManagerMasterEndpoint下发的命令。
1 BlockManagerMaster的职责
BlockManagerMaster负责发送各种与存储体系相关的信息,这些消息的类型如下:
- RemoveExecutor(移除Executor)
- RegisterBlockManager(注册BlockManager)
- UpdateBlockInfo(更新Block信息)
- GetLocations(获取Block的位置)
- GetLocationsMultipleBlockIds(获取多个Block的位置)
- GetPeers(获取其它BlockManager的BlockManagerId)
- GetExecutorEndpointRef(获取Executor的EndpointRef引用)
- RemoveBlock(移除Block)
- RemoveRdd(移除Rdd Block)
- RemoveShuffle(移除Shuffle Block)
- RemoveBroadcast(移除Broadcast Block)
- GetMemoryStatus(获取指定的BlockManager的内存状态)
- GetStorageStatus(获取存储状态)
- GetMatchingBlockIds(获取匹配过滤条件的Block)
- HasCachedBlocks(指定的Executor上是否有缓存的Block)
- StopBlockManagerMaster(停止BlockManagerMaster)
可以看到,BlockManagerMaster能够发送的消息类型多种多样,为了更容易理解,以RegisterBlockManager为例:
//org.apache.spark.storage.BlockManagerMaster
def registerBlockManager(
blockManagerId: BlockManagerId, maxMemSize: Long, slaveEndpoint: RpcEndpointRef): Unit = {
logInfo(s"Registering BlockMana