訂閱
糾錯
加入自媒體

深度解析Spark底層執(zhí)行原理(建議收藏)

2021-03-13 08:49
園陌
關(guān)注

Spark簡介

Apache Spark是用于大規(guī)模數(shù)據(jù)處理的統(tǒng)一分析引擎,基于內(nèi)存計(jì)算,提高了在大數(shù)據(jù)環(huán)境下數(shù)據(jù)處理的實(shí)時(shí)性,同時(shí)保證了高容錯性和高可伸縮性,允許用戶將Spark部署在大量硬件之上,形成集群。

Spark源碼從1.x的40w行發(fā)展到現(xiàn)在的超過100w行,有1400多位大牛貢獻(xiàn)了代碼。整個(gè)Spark框架源碼是一個(gè)巨大的工程。下面我們一起來看下spark的底層執(zhí)行原理。

Spark運(yùn)行流程

Spark運(yùn)行流程

具體運(yùn)行流程如下:

SparkContext 向資源管理器注冊并向資源管理器申請運(yùn)行Executor

資源管理器分配Executor,然后資源管理器啟動Executor

Executor 發(fā)送心跳至資源管理器

SparkContext 構(gòu)建DAG有向無環(huán)圖

將DAG分解成Stage(TaskSet)

把Stage發(fā)送給TaskScheduler

Executor 向 SparkContext 申請 Task

TaskScheduler 將 Task 發(fā)送給 Executor 運(yùn)行

同時(shí) SparkContext 將應(yīng)用程序代碼發(fā)放給 Executor

Task 在 Executor 上運(yùn)行,運(yùn)行完畢釋放所有資源

1. 從代碼角度看DAG圖的構(gòu)建Val lines1 = sc.textFile(inputPath1).map(...).map(...)

Val lines2 = sc.textFile(inputPath2).map(...)

Val lines3 = sc.textFile(inputPath3)

Val dtinone1 = lines2.union(lines3)

Val dtinone = lines1.join(dtinone1)

dtinone.saveAsTextFile(...)

dtinone.filter(...).foreach(...)

上述代碼的DAG圖如下所示:

構(gòu)建DAG圖

Spark內(nèi)核會在需要計(jì)算發(fā)生的時(shí)刻繪制一張關(guān)于計(jì)算路徑的有向無環(huán)圖,也就是如上圖所示的DAG。

Spark 的計(jì)算發(fā)生在RDD的Action操作,而對Action之前的所有Transformation,Spark只是記錄下RDD生成的軌跡,而不會觸發(fā)真正的計(jì)算。

2. 將DAG劃分為Stage核心算法

一個(gè)Application可以有多個(gè)job多個(gè)Stage:

Spark Application中可以因?yàn)椴煌腁ction觸發(fā)眾多的job,一個(gè)Application中可以有很多的job,每個(gè)job是由一個(gè)或者多個(gè)Stage構(gòu)成的,后面的Stage依賴于前面的Stage,也就是說只有前面依賴的Stage計(jì)算完畢后,后面的Stage才會運(yùn)行。

劃分依據(jù):

Stage劃分的依據(jù)就是寬依賴,像reduceByKey,groupByKey等算子,會導(dǎo)致寬依賴的產(chǎn)生。

回顧下寬窄依賴的劃分原則:  

窄依賴:父RDD的一個(gè)分區(qū)只會被子RDD的一個(gè)分區(qū)依賴。即一對一或者多對一的關(guān)系,可理解為獨(dú)生子女。 常見的窄依賴有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned)等。      

寬依賴:父RDD的一個(gè)分區(qū)會被子RDD的多個(gè)分區(qū)依賴(涉及到shuffle)。即一對多的關(guān)系,可理解為超生。常見的寬依賴有g(shù)roupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned)等。

核心算法:回溯算法

從后往前回溯/反向解析,遇到窄依賴加入本Stage,遇見寬依賴進(jìn)行Stage切分。

Spark內(nèi)核會從觸發(fā)Action操作的那個(gè)RDD開始從后往前推,首先會為最后一個(gè)RDD創(chuàng)建一個(gè)Stage,然后繼續(xù)倒推,如果發(fā)現(xiàn)對某個(gè)RDD是寬依賴,那么就會將寬依賴的那個(gè)RDD創(chuàng)建一個(gè)新的Stage,那個(gè)RDD就是新的Stage的最后一個(gè)RDD。
然后依次類推,繼續(xù)倒推,根據(jù)窄依賴或者寬依賴進(jìn)行Stage的劃分,直到所有的RDD全部遍歷完成為止。

1  2  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報(bào)。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個(gè)字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號