Spark中BlockManager的存儲原理

一.整體架構(gòu)

Spark的存儲介質(zhì)包括磁盤和內(nèi)存撩笆。

Spark的存儲采用了主從模型,存儲模塊使用了基于Netty的RPC消息通信方式抒线。BlockManagerMaster負(fù)責(zé)整個應(yīng)用程序運行期間的數(shù)據(jù)塊的元數(shù)據(jù)管理和維護(hù)班巩。BlockManager(Slave)負(fù)責(zé)將本地數(shù)據(jù)塊的狀態(tài)信息上報給BlockManagerMaster,同時接受從BlockManagerMaster傳過來的執(zhí)行命令嘶炭,如獲取數(shù)據(jù)塊狀態(tài)抱慌,刪除數(shù)據(jù)塊等命令。每個BlockManager中都存在數(shù)據(jù)傳輸通道眨猎,根據(jù)需要進(jìn)行遠(yuǎn)程數(shù)據(jù)的讀取和寫入抑进。

在應(yīng)用程序啟動期間,SparkContext會創(chuàng)建Driver端的SparkEnv睡陪,在該SparkEnv中實例化BlockManagerMaster寺渗,在BlockManagerMaster內(nèi)部創(chuàng)建消息通信的端點BlockManagerMasterEndpoint。

同理兰迫,在Executor啟動時信殊,也會創(chuàng)建SparkEnv,在該SparkEnv中實例化BlockManager和負(fù)責(zé)網(wǎng)絡(luò)數(shù)據(jù)傳輸服務(wù)的BlockTransferService汁果。BlockManager初始化過程中涡拘,會加入BlockManagerMasterEndpoint端點的引用,同時也會創(chuàng)建BlockManagerSlaveEndpoint端點须鼎,并把該端點的引用注冊到Driver中鲸伴,這樣Driver和Executor互相持有通信端點的引用,可以在應(yīng)用程序執(zhí)行過程中進(jìn)行消息通信晋控。BlockTransferService中使用了基于Netty的數(shù)據(jù)傳輸方式汞窗,該傳輸方式隱藏了集群間不同節(jié)點的消息傳輸操作,可以類似于本地數(shù)據(jù)操作方式進(jìn)行數(shù)據(jù)讀寫赡译,大大簡化了網(wǎng)絡(luò)間數(shù)據(jù)傳輸?shù)膹?fù)雜程度仲吏。

Spark存儲整體架構(gòu)圖如下:

BlockManager存儲系統(tǒng)架構(gòu)

1.數(shù)據(jù)塊位置信息的獲取
應(yīng)用程序在完成數(shù)據(jù)存儲后,后續(xù)的task在獲取遠(yuǎn)程節(jié)點數(shù)據(jù)蝌焚,獲取rdd執(zhí)行的首選位置等操作需要根據(jù)數(shù)據(jù)塊的編號查詢出數(shù)據(jù)塊所處的位置裹唆,此時發(fā)送getLocation或者getLocationMultipleBlockIds等消息給BlockManagerMasterEndpoint端點,通過對元數(shù)據(jù)的查詢獲取數(shù)據(jù)塊的位置信息只洒。

2.數(shù)據(jù)塊的刪除
Spark提供刪除RDD许帐,數(shù)據(jù)塊和廣播變量的方式,當(dāng)數(shù)據(jù)需要刪除時毕谴,提交刪除成畦。當(dāng)數(shù)據(jù)需要刪除時距芬,提交刪除消息給BlockManagerSlaveEndpoint端點,在該端點對應(yīng)發(fā)起刪除操作循帐,刪除操作一方面需要先通知Driver端刪除數(shù)據(jù)塊的元數(shù)據(jù)信息框仔,另一方面需要發(fā)送消息通知Executor,刪除對應(yīng)的物理數(shù)據(jù)拄养。這里需要注意這個先后順序离斩,以免物理數(shù)據(jù)刪除完畢之后,還存在元數(shù)據(jù)未刪除瘪匿。

Block數(shù)據(jù)的刪除

3.數(shù)據(jù)塊的讀取
Executor的BlockManager接受到讀取數(shù)據(jù)的請求時候跛梗,根據(jù)數(shù)據(jù)塊所在的節(jié)點是否在本地,調(diào)用BlockManager的不同方法去處理柿顶,如果在本地則調(diào)用MemoryStore或者DiskStore中的取方法茄袖,進(jìn)行讀取,如果在遠(yuǎn)程嘁锯,則調(diào)用BlockTransferService的服務(wù)去遠(yuǎn)程節(jié)點上獲取數(shù)據(jù)。

Block數(shù)據(jù)的讀取

4.數(shù)據(jù)塊的寫入
當(dāng)Executor的BlockManager接受到寫數(shù)據(jù)的請求時聂薪,如果不需要創(chuàng)建副本家乘,則調(diào)用BlockStore的接口方法去進(jìn)行處理,根據(jù)數(shù)據(jù)寫入的存儲類型藏澳,決定調(diào)用對應(yīng)的寫入方法仁锯。

Block數(shù)據(jù)的寫入

二.存儲級別

Spark的內(nèi)部維護(hù)的存儲,還支持以內(nèi)存或者磁盤存儲的方式存儲RDD的數(shù)據(jù)集翔悠。通過調(diào)用RDD的persist或者cache來完成對應(yīng)的操作业崖。

在RDD第一次被計算時,persist方法會根據(jù)StorageLevel的參數(shù)值來采用不同的緩存(持久化)策略蓄愁。當(dāng)RDD的原本存儲級別為None或者新傳遞進(jìn)來的存儲級別值與原來的存儲級別相等時才進(jìn)行操作双炕。

persist操作是控制操作的一種,它只是改變了RDD的元數(shù)據(jù)信息撮抓,并沒由真正的進(jìn)行數(shù)據(jù)的存儲操作妇斤,真正進(jìn)行的是RDD的iterator方法,對應(yīng)cache來說丹拯,他是persist的一個特例站超,即persist中的StorageLevel的值為MEMERY-ONLY的情形。

在StorageLevel類中乖酬,根據(jù)useDisk死相,useMemory,useOffHeap咬像,deserialized算撮,replication這5個參數(shù)的組合双肤,Spark提供了12種存儲級別的持久化策略,可以將RDD持久化到內(nèi)存钮惠,磁盤和外部存儲系統(tǒng)茅糜,或者以序列化的方式持久化到內(nèi)存,還能夠在集群的不同節(jié)點之間存儲多個副本素挽。

Spark存儲級別如下所示

Storage Level 描述
MEMORY_ONLY 默認(rèn)選項蔑赘,RDD的(分區(qū))數(shù)據(jù)直接以Java對象的形式存儲于JVM的內(nèi)存中,如果內(nèi)存空間不足预明,某些分區(qū)的數(shù)據(jù)將不會被緩存缩赛,需要在使用的時候重新計算。
MEMORY_AND_DISK RDD的數(shù)據(jù)直接以Java對象的形式存儲于JVM的內(nèi)存中撰糠,如果內(nèi)存空間不中酥馍,某些分區(qū)的數(shù)據(jù)會被存儲至磁盤,使用的時候從磁盤讀取阅酪。
MEMORY_ONLY_SER RDD的數(shù)據(jù)(Java對象)序列化之后存儲于JVM的內(nèi)存中(一個分區(qū)的數(shù)據(jù)為內(nèi)存中的一個字節(jié)數(shù)組)旨袒,相比于MEMORY_ONLY能夠有效節(jié)約內(nèi)存空間(特別是使用一個快速序列化工具的情況下),但讀取數(shù)據(jù)時需要更多的CPU開銷术辐;如果內(nèi)存空間不足砚尽,處理方式與MEMORY_ONLY相同。
MEMORY_AND_DISK_SER 相比于MEMORY_ONLY_SER辉词,在內(nèi)存空間不足的情況下必孤,將序列化之后的數(shù)據(jù)存儲于磁盤。
DISK_ONLY 僅僅使用磁盤存儲RDD的數(shù)據(jù)(未經(jīng)序列化)瑞躺。
MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc. 以MEMORY_ONLY_2為例敷搪,MEMORY_ONLY_2相比于MEMORY_ONLY存儲數(shù)據(jù)的方式是相同的,不同的是會將數(shù)據(jù)備份到集群中兩個不同的節(jié)點幢哨,其余情況類似赡勘。
OFF_HEAP (experimental) 與MEMORY_ONLY_SER類似,但是存儲在非堆的內(nèi)存中嘱么,需要開啟非堆內(nèi)存狮含。

這里需要注意,即使沒有使用persisit曼振,Spark在進(jìn)行shuffle的操作的時候也會自動的持久化某些中間數(shù)據(jù)几迄。這樣可以避免在有節(jié)點丟失的情況下,重復(fù)計算input冰评。對于 resulting RDD如果需要重復(fù)使用的話映胁, 強烈建議使用persist進(jìn)行持久化。

如何選擇存儲級別甲雅?

默認(rèn)情況下解孙,性能最高的當(dāng)然是MEMORY_ONLY坑填,但前提是你的內(nèi)存必須足夠足夠大,可以綽綽有余地存放下整個RDD的所有數(shù)據(jù)弛姜。因為不進(jìn)行序列化與反序列化操作脐瑰,就避免了這部分的性能開銷;對這個RDD的后續(xù)算子操作廷臼,都是基于純內(nèi)存中的數(shù)據(jù)的操作苍在,不需要從磁盤文件中讀取數(shù)據(jù),性能也很高荠商;而且不需要復(fù)制一份數(shù)據(jù)副本寂恬,并遠(yuǎn)程傳送到其他節(jié)點上。但是這里必須要注意的是莱没,在實際的生產(chǎn)環(huán)境中初肉,恐怕能夠直接用這種策略的場景還是有限的,如果RDD中數(shù)據(jù)比較多時(比如幾十億)饰躲,直接用這種持久化級別牙咏,會導(dǎo)致JVM的OOM內(nèi)存溢出異常。

如果使用MEMORY_ONLY級別時發(fā)生了內(nèi)存溢出属铁,那么建議嘗試使用MEMORY_ONLY_SER級別眠寿。該級別會將RDD數(shù)據(jù)序列化后再保存在內(nèi)存中,此時每個partition僅僅是一個字節(jié)數(shù)組而已焦蘑,大大減少了對象數(shù)量,并降低了內(nèi)存占用盒发。這種級別比MEMORY_ONLY多出來的性能開銷例嘱,主要就是序列化與反序列化的開銷。但是后續(xù)算子可以基于純內(nèi)存進(jìn)行操作宁舰,因此性能總體還是比較高的拼卵。此外,可能發(fā)生的問題同上蛮艰,如果RDD中的數(shù)據(jù)量過多的話腋腮,還是可能會導(dǎo)致OOM內(nèi)存溢出的異常。

如果純內(nèi)存的級別都無法使用壤蚜,那么建議使用MEMORY_AND_DISK_SER策略即寡,而不是MEMORY_AND_DISK策略。因為既然到了這一步袜刷,就說明RDD的數(shù)據(jù)量很大聪富,內(nèi)存無法完全放下。序列化后的數(shù)據(jù)比較少著蟹,可以節(jié)省內(nèi)存和磁盤的空間開銷墩蔓。同時該策略會優(yōu)先盡量嘗試將數(shù)據(jù)緩存在內(nèi)存中梢莽,內(nèi)存緩存不下才會寫入磁盤。

通常不建議使用DISK_ONLY和后綴為_2的級別:因為完全基于磁盤文件進(jìn)行數(shù)據(jù)的讀寫奸披,會導(dǎo)致性能急劇降低昏名,有時還不如重新計算一次所有RDD。后綴為_2的級別阵面,必須將所有數(shù)據(jù)都復(fù)制一份副本轻局,并發(fā)送到其他節(jié)點上,數(shù)據(jù)復(fù)制以及網(wǎng)絡(luò)傳輸會導(dǎo)致較大的性能開銷膜钓,除非是要求作業(yè)的高可用性嗽交,否則不建議使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颂斜,一起剝皮案震驚了整個濱河市夫壁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沃疮,老刑警劉巖盒让,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異司蔬,居然都是意外死亡邑茄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門俊啼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肺缕,“玉大人,你說我怎么就攤上這事授帕⊥荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵跛十,是天一觀的道長彤路。 經(jīng)常有香客問我,道長芥映,這世上最難降的妖魔是什么洲尊? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奈偏,結(jié)果婚禮上坞嘀,老公的妹妹穿的比我還像新娘。我一直安慰自己霎苗,他們只是感情好姆吭,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唁盏,像睡著了一般内狸。 火紅的嫁衣襯著肌膚如雪检眯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天昆淡,我揣著相機與錄音锰瘸,去河邊找鬼。 笑死昂灵,一個胖子當(dāng)著我的面吹牛避凝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眨补,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼管削,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撑螺?” 一聲冷哼從身側(cè)響起含思,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甘晤,沒想到半個月后含潘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡线婚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年遏弱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞弊。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漱逸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出游沿,到底是詐尸還是另有隱情虹脯,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布奏候,位于F島的核電站,受9級特大地震影響唇敞,放射性物質(zhì)發(fā)生泄漏蔗草。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一疆柔、第九天 我趴在偏房一處隱蔽的房頂上張望咒精。 院中可真熱鬧,春花似錦旷档、人聲如沸模叙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽范咨。三九已至故觅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渠啊,已是汗流浹背输吏。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留替蛉,地道東北人贯溅。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像躲查,于是被迫代替她去往敵國和親它浅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容