零、本節(jié)學(xué)習(xí)目標(biāo)
- 理解DAG概念
- 了解Stage劃分
- 了解RDD在Spark中的運(yùn)行流程
一、有向無環(huán)圖
(一)DAG概念
-
DAG(Directed Acyclic Graph)叫做有向無環(huán)圖,Spark中的RDD通過一系列的轉(zhuǎn)換算子操作和行動(dòng)算子操作形成了一個(gè)DAG。DAG是一種非常重要的圖論數(shù)據(jù)結(jié)構(gòu)。如果一個(gè)有向圖無法從任意頂點(diǎn)出發(fā)經(jīng)過若干條邊回到該點(diǎn),則這個(gè)圖就是有向無環(huán)圖。“4→6→1→2”是一條路徑,“4→6→5”也是一條路徑,并且圖中不存在從頂點(diǎn)經(jīng)過若干條邊后能回到該點(diǎn)。
(二)實(shí)例講解
- 根據(jù)RDD之間依賴關(guān)系的不同可將DAG劃分成不同的Stage(調(diào)度階段)。對(duì)窄依賴來說,RDD分區(qū)的轉(zhuǎn)換處理是在一個(gè)線程里完成,所以窄依賴會(huì)被Spark劃分到同一個(gè)Stage中;而對(duì)寬依賴來說,由于有Shuffle存在,所以只能在父RDD處理完成后,下一個(gè)Stage才能開始接下來的計(jì)算,因此寬依賴是劃分Stage的依據(jù),當(dāng)RDD進(jìn)行轉(zhuǎn)換操作,遇到寬依賴類型的轉(zhuǎn)換操作時(shí),就劃為一個(gè)Stage。
- A、C、E是三個(gè)RDD的實(shí)例
- 當(dāng)A做groupByKey轉(zhuǎn)換操作生成B時(shí),由于groupByKey轉(zhuǎn)換操作屬于寬依賴類型,所以就把A劃分為一個(gè)Stage,如Stage1。
- 當(dāng)C做map轉(zhuǎn)換操作生成D, D與E做union轉(zhuǎn)換操作生成F。由于map和union轉(zhuǎn)換操作都屬于窄依賴類型,因此不進(jìn)行Stage的劃分,而是將C、D、E、F加入到同一個(gè)Stage中。
- 當(dāng)F與B進(jìn)行join轉(zhuǎn)換操作時(shí),由于這時(shí)的join操作是非協(xié)同劃分,所以屬于寬依賴,因此會(huì)劃分為一個(gè)Stage,如Stage2。
- 剩下的B和G被劃分為一個(gè)Stage,如Stage3。
二、Stage劃分依據(jù)
- Spark會(huì)根據(jù)DAG將整個(gè)計(jì)算劃分為多個(gè)階段,每個(gè)階段稱為一個(gè)Stage。每個(gè)Stage由多個(gè)Task任務(wù)并行進(jìn)行計(jì)算,每個(gè)Task任務(wù)作用在一個(gè)分區(qū)上,一個(gè)Stage的總Task任務(wù)數(shù)量是由Stage中最后一個(gè)RDD的分區(qū)個(gè)數(shù)決定的。
- Stage的劃分依據(jù)為是否有寬依賴,即是否有Shuffle。Spark調(diào)度器會(huì)從DAG圖的末端向前進(jìn)行遞歸劃分,遇到Shuffle則進(jìn)行劃分,Shuffle之前的所有RDD組成一個(gè)Stage,整個(gè)DAG圖為一個(gè)Stage。
(一)兩階段案例
- 經(jīng)典的單詞計(jì)數(shù)執(zhí)行流程的Stage劃分如下圖所示。
- 上圖中的依賴關(guān)系一共可以劃分為兩個(gè)Stage:從后向前進(jìn)行遞歸劃分,RDD3到RDD4的轉(zhuǎn)換是Shuffle操作,因此在RDD3與RDD4之間劃開,繼續(xù)向前查找,RDD1、RDD2、RDD3之間的關(guān)系為窄依賴,因此為一個(gè)Stage;整個(gè)轉(zhuǎn)換過程為一個(gè)Stage。
(二)三階段案例
- 下圖中的依賴關(guān)系一共可以劃分為3個(gè)Stage:從后向前進(jìn)行遞歸劃分,由于RDD6到RDD7的轉(zhuǎn)換是Shuffle操作,因此在RDD6與RDD7之間劃開,然后繼續(xù)向前查找,RDD3、RDD4、RDD5、RDD6為一個(gè)Stage;由于RDD1到RDD2的轉(zhuǎn)換是Shuffle操作,因此在RDD1與RDD2之間劃開,然后繼續(xù)向前查找,RDD1為一個(gè)Stage;整個(gè)轉(zhuǎn)換過程為一個(gè)Stage。
三、RDD在Spark中的運(yùn)行流程
- Spark的任務(wù)調(diào)度流程,即RDD在Spark中的運(yùn)行流程分為RDD Objects、DAGScheduler、TaskScheduler以及Worker四個(gè)部分。
(一)RDD Objects
- 當(dāng)RDD對(duì)象創(chuàng)建后,SparkContext會(huì)根據(jù)RDD對(duì)象構(gòu)建DAG有向無環(huán)圖,然后將Task提交給DAGScheduler。
(二)DAGScheduler
- 將作業(yè)的DAG劃分成不同Stage,每個(gè)Stage都是TaskSet任務(wù)集合,并以TaskSet為單位提交給TaskScheduler。
(三)TaskScheduler
- 通過TaskSetManager管理Task,并通過集群中的資源管理器把Task發(fā)給集群中Worker的Executor。
(四)Worker
- Spark集群中的Worker接收到Task后,把Task運(yùn)行在Executor進(jìn)程中,一個(gè)進(jìn)程中可以有多個(gè)線程在工作,從而可以處理多個(gè)數(shù)據(jù)分區(qū)。
文章來源地址http://www.zghlxwxcb.cn/news/detail-489523.html
文章來源:http://www.zghlxwxcb.cn/news/detail-489523.html
到了這里,關(guān)于Spark大數(shù)據(jù)處理講課筆記3.7 Spark任務(wù)調(diào)度的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!