Spark 性能調(diào)優(yōu)核心原理,你會嗎?
用了這么久spark了,今天總結(jié)下他的一些優(yōu)化方面的核心原理,今天我們分這么幾個方面來談:
一.RDD
RDD是彈性分布式數(shù)據(jù)集的簡稱,他是其他后來者,比如DataFrame,DataSet等的基礎(chǔ)。他有四大核心屬性,如下所示。
這4 大屬性又可以劃分為兩類,橫向?qū)傩院涂v向?qū)傩?。其中,橫向?qū)傩藻^定數(shù)據(jù)分片實體,并規(guī)定了數(shù)據(jù)分片在分布式集群中如何分布。
縱向?qū)傩杂糜谠诳v深方向構(gòu)建 DAG,通過提供重構(gòu) RDD 的容錯能力保障內(nèi)存計算的穩(wěn)定性。
其實RDD還有個特性:優(yōu)先位置列表.算上他總共有5大特性。白話文總結(jié)就是:3個列表,2個函數(shù)。3個列表是分區(qū)列表,依賴列表和優(yōu)先位置列表;2個函數(shù)就是:計算函數(shù)和分區(qū)函數(shù)。
二.內(nèi)存計算
在 Spark 中,內(nèi)存計算有兩層含義:第一層含義就是眾所周知的分布式數(shù)據(jù)緩存,第二層含義是 Stage 內(nèi)的流水線式計算模式。
流水線計算模式指的是:在同一 Stage 內(nèi)部,所有算子融合為一個函數(shù),Stage 的輸出結(jié)果由這個函數(shù)一次性作用在輸入數(shù)據(jù)集而產(chǎn)生。
所謂內(nèi)存計算,不僅僅是指數(shù)據(jù)可以緩存在內(nèi)存中,更重要的是,通過計算的融合來大幅提升數(shù)據(jù)在內(nèi)存中的轉(zhuǎn)換效率,進(jìn)而從整體上提升應(yīng)用的執(zhí)行性能。
比如這個栗子:
如圖所示,在上面的計算流程中,如果你把流水線看作是內(nèi)存,每一步操作過后都會生成臨時數(shù)據(jù),如圖中的 clean 和 slice,這些臨時數(shù)據(jù)都會緩存在內(nèi)存里。但在下面的內(nèi)存計算中,所有操作步驟如 clean、slice、bake,都會被捏合在一起構(gòu)成一個函數(shù)。這個函數(shù)一次性地作用在“帶泥土豆”上,直接生成“即食薯片”,在內(nèi)存中不產(chǎn)生任何中間數(shù)據(jù)形態(tài)。
補(bǔ)充下:從程序員的視角出發(fā),DAG 的構(gòu)建是通過在分布式數(shù)據(jù)集上不停地調(diào)用算子來完成的,DAG 以 Actions 算子為起點(diǎn),從后向前回溯,以 Shuffle 操作為邊界,劃分出不同的 Stages。同一 Stage 內(nèi)所有算子融合為一個函數(shù),Stage 的輸出結(jié)果由這個函數(shù)一次性作用在輸入數(shù)據(jù)集而產(chǎn)生。