您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么實現Spark2.x BlockManager原理剖析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
一、概述
BlockManager是Spark底層負責數據的讀寫和管理的一個模塊。
對于每一個Spark任務,Driver節點都會有一個BlockManagerMaster 實例,而每一個Executor上都對應的有一個BlockManager實例,它也構成了一套Master/Slaver架構的數據管理體系,比如ShuffleWriter都是通過將BlockManager將數據寫入磁盤或者內容、各個Task在拉取數據的時候也是通過BlockManger建立連接,然后去拉取數據。
這里我們先對BlockManager的原理做一個簡單的介紹。
二、圖解BlockManager整體架構
下面詳細講解這個架構圖:
1.由BlockManager原理架構圖可以看出對于每個Spark任務,Driver都會初始化一個BlockManagerMaster實例,初始化同時也會創建一個BlockManagerMasterEndPoint實例,BlockManagerMasterEndpoint是一個ThreadSafeRpcEndpoint類,接收Executor中Blockmanager的消息請求,進行對應的處理。SparkEnv類中的實現代碼如下:
val blockManagerMaster = new BlockManagerMaster(registerOrLookupEndpoint( BlockManagerMaster.DRIVER_ENDPOINT_NAME, new BlockManagerMasterEndpoint(rpcEnv, isLocal, conf, listenerBus)), conf, isDriver)
2.在BlockManagerMasterEndPoint中管理著一組HashMap數據結構BlockManagerInfo信息,保存著BlockManagerId與BlockManagerInfo的對應關系,這里相當于管理者每個Executor中的Block的元數據信息,比如各個BlockManager端新增、刪除了一個Block后,這里對應也要更新對應的元數據信息,BlockManagerMasterEndPoint類實現代碼如下:
// Mapping from block manager id to the block manager's information. private val blockManagerInfo = new mutable.HashMap[BlockManagerId, BlockManagerInfo]
3.BlockManagerInfo里面保存著所在Executor所有Block的狀態信息,這里也是一個HashMap結構,保存著block與其BlockStatus信息,BlockManagerInfo類代碼實現如下:
// Mapping from block id to its status.private val _blocks = new JHashMap[BlockId, BlockStatus]
Driver端總結一下,其實就是通過BlockManagerMaster維護各個節點Block元數據信息,比如各個BlockManager端的Block發生增、刪、改等操作,都會在這里進行更新。
4.在Executor端的都有一個BlockManager實例,它有四個比較重要的組件,這里大體介紹下,后面源碼剖析會作詳細介紹:
1).DiskStore
負責磁盤數據的讀寫操作;
2).MemoryStore
負責內存數據的讀寫操作;
3).ConnectionManager:
負責與其他的BlockManger連接,比如ShuffleReader階段需要從遠程拉取數據,這里負責遠程的連接。
4).BlockTransferService
這里ConnectionManager與其他的BlockManger連接成功后,負責進行數據的傳輸。
5.BlockManager創建成功之后的第一件事就是去向BlockManagerMaster進行注冊,此時就會在它的blockManagerInfo中添加對應的BlockManagerInfo信息。
6.這里有一點需要注意:BlockManager進行數據寫操作時,優先將數據寫入內存,如果內存不夠會根據自己的算法,將內存中的部分數據寫入磁盤。此外如果指定了relication副本,就會使用BlockManager將數據復制一份到其他的BlockManager中,所以就會存在一個Block會存在兩個BlockManger的情況。
7.BlockManager進行數據讀取時,比如ShuffleReader階段,如果能從本地讀取數據就從本地讀,不然會通過ConnectionManager與遠程BlockManager節點建立連接,連接成功后,BlockTransferService再去BlockManager節點獲取數據。
8.只要是BlockManager端對數據進行了增、刪、改操作,都會向BlockManagerMaster發送BlockStatus變更的消息通知,然后BlockManagerMaster會更新他自己維護的BlockManagerInfo元數據信息。
關于怎么實現Spark2.x BlockManager原理剖析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。