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