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