本文为 Spark 2.0 源码分析笔记,某些实现可能与其他版本有所出入
再次重申标题中的 Master 是指 Spark Storage 模块的 Master,是运行在 driver 上的 BlockManager 及其包含的 BlockManagerMaster、RpcEnv 及 RpcEndpoint 等;而 Slave 则是指 Spark Storage 模块的 Slave,是运行在 executor 上的 BlockManager 及其包含的 BlockManagerMaster、RpcEnv 及 RpcEndpoint 等。下文也将沿用 Master 和 Slave 简称。
Master 与 Slaves 之间是通过消息进行通信的,本文将分析 Master 与 Slaves 之间重要的消息以及这些消息是在什么时机被触发发送的。
先来看看 Master 都会发哪些消息给 Slave
用于移除 slave 上的 block。在以下两个时机会触发:
用于移除归属于某个 RDD 的所有 blocks,触发时机:
用于移除归属于某次 shuffle 所有的 blocks,触发时机:
用于移除归属于特定 Broadcast 的所有 blocks。触发时机:
Broadcast#destroy
销毁广播变量Broadcast#unpersist
删除 executors 上的广播变量拷贝接下来看看 Slaves 发送给 Master 的消息
用于 Slave(executor 端 BlockManager) 向 Master(driver 端 BlockManager) 注册,触发时机:
用于向 Master 汇报指定 block 的信息,包括:storageLevel、存储在内存中的 size、存储在磁盘上的 size、是否 cached 等。触发时机:
用于获取指定 blockId 的 block 所在的 BlockManagerId 列表,触发时机:
用于移除已 lost 的 executor 上的 BlockManager(只在 driver 端进行操作),触发时机:
用于停止 driver 或 executor 端的 BlockManager,触发时机:
用于获取各个 BlockManager 的内存使用情况,包括最大可用内存以及当前可用内存(当前可用内存=最大可用内存-已用内存)
用于获取各个 BlockManager 的存储状态,包括每个 BlockManager 中都存储了哪些 RDD 的哪些 block(对应 partition)以及各个 block 的信息
用于 Slave 向 Master 发心跳信息,以通知 Master 其上的某个 BlockManager 还存活着
用于检查 executor 是否有缓存 blocks(广播变量的 blocks 不作考虑,因为广播变量的 block 不会汇报给 Master),触发时机: