在Spark中,什么叫內(nèi)存計(jì)算?
本文轉(zhuǎn)載自微信公眾號(hào)「記錄技術(shù)記錄我」,作者ziwen。轉(zhuǎn)載本文請(qǐng)聯(lián)系記錄技術(shù)記錄我公眾號(hào)。
在 Spark 中,內(nèi)存計(jì)算有兩層含義:
- 第一層含義就是眾所周知的分布式數(shù)據(jù)緩存;
- 第二層含義是 Stage 內(nèi)的流水線式計(jì)算模式,通過(guò)計(jì)算的融合來(lái)大幅提升數(shù)據(jù)在內(nèi)存中的轉(zhuǎn)換效率,進(jìn)而從整體上提升應(yīng)用的執(zhí)行性能;
那 Stage 內(nèi)的流水線式計(jì)算模式到底長(zhǎng)啥樣呢?在 Spark 中,流水線計(jì)算模式指的是:在同一 Stage 內(nèi)部,所有算子融合為一個(gè)函數(shù),Stage 的輸出結(jié)果,由這個(gè)函數(shù)一次性作用在輸入數(shù)據(jù)集而產(chǎn)生。
我們用一張圖來(lái)直觀地解釋這一計(jì)算模式。
在上面的計(jì)算流程中,如果你把流水線看作是內(nèi)存,每一步操作過(guò)后都會(huì)生成臨時(shí)數(shù)據(jù),如圖中的 clean 和 slice,這些臨時(shí)數(shù)據(jù)都會(huì)緩存在內(nèi)存里。
但在下面的內(nèi)存計(jì)算中,所有操作步驟如 clean、slice、bake,都會(huì)被捏合在一起構(gòu)成一個(gè)函數(shù)。這個(gè)函數(shù)一次性地作用在“帶泥土豆”上,直接生成“即食薯片”,在內(nèi)存中不產(chǎn)生任何中間數(shù)據(jù)形態(tài)。
由于計(jì)算的融合只發(fā)生在 Stages 內(nèi)部,而 Shuffle 是切割 Stages 的邊界,因此一旦發(fā)生 Shuffle,內(nèi)存計(jì)算的代碼融合就會(huì)中斷。但是,當(dāng)我們對(duì)內(nèi)存計(jì)算有了多方位理解以后,就不會(huì)一股腦地只想到用 cache 去提升應(yīng)用的執(zhí)行性能,而是會(huì)更主動(dòng)地想辦法盡量避免 Shuffle,讓應(yīng)用代碼中盡可能多的部分融合為一個(gè)函數(shù),從而提升計(jì)算效率。