【源碼解析】BlockManager詳解

1 Block管理模塊的組件和功能

  • BlockManager:BlockManager源碼解析
    • Driver和Executor都會建立
    • Block的put、get和remove等操做的實際執行者
  • BlockManagerMaster:BlockManagerMaster源碼解析框架

    • 做爲BlockManagerMasterEndpoint的代理類,隱藏實體類
    • 執行BlockManager中註冊等操做
  • BlockManagerMasterEndpoint:BlockManagerMasterEndpoint源碼解析
    • 響應遠程調用的實體類
    • 維護BlockManager的元數據
    • 擁有移除RDD、獲取Block和更新BlockInfo等功能
  • BlockManagerSlaveEndpoint:BlockManagerSlaveEndpoint源碼解析
    • Executor端響應遠程調用的類
    • 內部實際調用BlockManager執行具體操做
  • BlockManagerInfo: BlockManagerInfo源碼解析
    • 維護着每一個BlockManager中所管理的Block
    • 持有BlockManagerSlaveEndpoint的實例
  • BlockManagerId:BlockManagerId源碼解析
    • 做爲每一個BlockManager的惟一標識
  • StorageLevel: StorageLevel源碼解析
    • 用來描述Block的存儲級別(存儲位置、是否序列化和副本數)
  • MemoryStore
    • 內存讀寫實際執行者
  • DiskStore
    • 磁盤讀寫實際執行者

2 總體框架

BlockManager

3 個人思考

在一開始分析BlockManager(BM)、BlockManagerMaster(BMM)、BlockManagerMasterEndpoint(BMME)和BlockManagerSlaveEndpoint(BMSE)時我就感受它們之間的功能定義和關係不是特別的清晰。
1)BMM做爲BMME的代理類,隱藏了BMME的實現,由BMME來完成實際響應遠程調用的動做,這個仍是比較清晰的,由於BMME維護着BlockManager的元數據信息,由它來完成信息的增刪查這個是徹底沒有問題的。
2)個人疑惑就在於BlockManager的定位是什麼?
首先從類設計原則來看,類的功能單一且清晰是比較重要的,由於這樣能夠清楚地看到類的定位設計

  • 完成實際數據的put、get和remove?這個在BM源碼中咱們能夠看到putBytes、getBytes等方法,這是沒有問題的
  • BlockManager向Driver註冊等

那麼BlockManager的定位就是處理一切跟Block讀寫等有關的工做和註冊等工做代理

3)可是我想來想去這個BlockManager就是處理Slave端的實際Block讀寫,那麼應該叫作BlockManagerSlave更貼切,可是做爲一個優秀的開源項目,不該該會出現這樣的問題。那麼多是個人理解問題,因而我又進行下面的思考:
Driver和Executor都有BlockManager,那麼Driver端BlockManager的做用僅僅是維護Executor端的BlockManager元數據的話,那麼Driver根本就不必建立BlockManager,使用BlockManagerMaster就能夠。因此極可能設計目的就是這樣的:blog

  • BlockManager的設計目的是做爲slave端的實際block管理類
  • Driver端的BlockManager實際由兩部分功能組成:
    • 擁有Slave端BlockManager實際操做Block的功能
    • 用BlockManagerMaster來實現Slave端全部BlockManager元數據的維護
相關文章
相關標籤/搜索