本文為 Spark 2.0 源碼分析筆記,某些實現(xiàn)可能與其他版本有所出入
Storage 模塊在整個 Spark 中扮演著重要的角色本慕,管理著 Spark Application 在運行過程中產(chǎn)生的各種數(shù)據(jù)衬潦,包括基于磁盤和內(nèi)存的师幕,比如 RDD 緩存孵滞,shuffle 過程中緩存及寫入磁盤的數(shù)據(jù)沾歪,廣播變量等漂彤。
Storage 模塊也是 Master/Slave 架構(gòu),Master 是運行在 driver 上的 BlockManager實例灾搏,Slave 是運行在 executor 上的 BlockManager 實例挫望。
Master 負(fù)責(zé):
- 接受各個 Slaves 注冊
- 保存整個 application 各個 blocks 的元數(shù)據(jù)
- 給各個 Slaves 下發(fā)命令
Slave 負(fù)責(zé):
- 管理存儲在其對應(yīng)節(jié)點內(nèi)存、磁盤上的 Blocks 數(shù)據(jù)
- 接收并執(zhí)行 Master 的命令
- 更新 block 信息給 Master
整體架構(gòu)圖如下(包含1個 Master 和4個 Slaves):
在 driver 端狂窑,創(chuàng)建 SparkContext 時會創(chuàng)建 driver 端的 SparkEnv媳板,在構(gòu)造 SparkEnv 時會創(chuàng)建 BlockManager,而該 BlockManager 持有 RpcEnv 和 BlockManagerMaster泉哈。其中蛉幸,RpcEnv 包含 driverRpcEndpoint 和各個 Slave 的 rpcEndpointRef(存儲在blockManagerInfo: mutable.HashMap[BlockManagerId, BlockManagerInfo]
中,BlockManagerInfo 包含對應(yīng) Slave 的 rpcEndpointRef)旨巷,Storage Master 就是通過這些 Slaves 的 rpcEndpointRef 來給 Storage Slave 發(fā)送消息下達(dá)命令的
而在 slave 端(各個 executor)巨缘,同樣會創(chuàng)建 SparkEnv,創(chuàng)建 SparkEnv 時同樣會創(chuàng)建 BlockManager采呐,slave 端的 BlockManager 同樣會持有 RpcEnv 以及 BlockManagerMaster若锁。不同的是,slave 端的 RpcEnv 包含了 slaveRpcEndpoint 而 BlockManagerMaster 持有 driverRpcEndpoint斧吐, Storage Slave 就是通過 driverRpcEndpoint 來給 Storage Master 發(fā)送消息的
好又固,基于上圖和相應(yīng)的文字說明相信能對 Spark Storage 模塊的整體架構(gòu)有個大致的了解,更深入的分析將在之后的文章中進(jìn)行~