11.Spark Core-Spark運(yùn)行原理

本文主要分以下章節(jié):

一、Spark專業(yè)術(shù)語定義

二、 Spark的任務(wù)提交機(jī)制

一、Spark專業(yè)術(shù)語定義

1、Application:Spark應(yīng)用程序

指的是用戶編寫的Spark應(yīng)用程序,包含了Driver功能代碼和分布在集群中多個(gè)節(jié)點(diǎn)上運(yùn)行的Executor代碼。

Spark應(yīng)用程序,由一個(gè)或多個(gè)作業(yè)JOB組成,如下圖所示:

image

2、Driver:驅(qū)動(dòng)程序

Spark中的Driver即運(yùn)行上述Application的Main()函數(shù)并且創(chuàng)建SparkContext,其中創(chuàng)建SparkContext的目的是為了準(zhǔn)備Spark應(yīng)用程序的運(yùn)行環(huán)境。在Spark中由SparkContext負(fù)責(zé)和ClusterManager通信,進(jìn)行資源的申請(qǐng)、任務(wù)的分配和監(jiān)控等;當(dāng)Executor部分運(yùn)行完畢后,Driver負(fù)責(zé)將SparkContext關(guān)閉。通常SparkContext代表Driver,如下圖所示:

image

3、Cluster Manager:資源管理器

指的是在集群上獲取資源的外部服務(wù),常用的有:Standalone,Spark原生的資源管理器,由Master負(fù)責(zé)資源的分配;Haddop Yarn,由Yarn中的ResearchManager負(fù)責(zé)資源的分配;Messos,由Messos中的Messos Master負(fù)責(zé)資源管理,如下圖所示:

image

4、Executor:執(zhí)行器

Application運(yùn)行在Worker節(jié)點(diǎn)上的一個(gè)進(jìn)程,該進(jìn)程負(fù)責(zé)運(yùn)行Task,并且負(fù)責(zé)將數(shù)據(jù)存在內(nèi)存或者磁盤上,每個(gè)Application都有各自獨(dú)立的一批Executor,如下圖所示:

image

5、Worker:計(jì)算節(jié)點(diǎn)

集群中任何可以運(yùn)行Application代碼的節(jié)點(diǎn),類似于Yarn中的NodeManager節(jié)點(diǎn)。在Standalone模式中指的就是通過Slave文件配置的Worker節(jié)點(diǎn),在Spark on Yarn模式中指的就是NodeManager節(jié)點(diǎn),在Spark on Messos模式中指的就是Messos Slave節(jié)點(diǎn),如下圖所示:

image

6、RDD:彈性分布式數(shù)據(jù)集

Resillient Distributed Dataset,Spark的基本計(jì)算單元,可以通過一系列算子進(jìn)行操作(主要有Transformation和Action操作),如下圖所示:

image

7、窄依賴

父RDD每一個(gè)分區(qū)最多被一個(gè)子RDD的分區(qū)所用;表現(xiàn)為一個(gè)父RDD的分區(qū)對(duì)應(yīng)于一個(gè)子RDD的分區(qū),或兩個(gè)父RDD的分區(qū)對(duì)應(yīng)于一個(gè)子RDD 的分區(qū)。如圖所示:

image

8、寬依賴

父RDD的每個(gè)分區(qū)都可能被多個(gè)子RDD分區(qū)所使用,子RDD分區(qū)通常對(duì)應(yīng)所有的父RDD分區(qū)。如圖所示:

image

常見的窄依賴有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被調(diào)用的RDD API是寬依賴(存在shuffle), 而且兩個(gè)join的RDD的分區(qū)數(shù)量一致,join結(jié)果的rdd分區(qū)數(shù)量也一樣,這個(gè)時(shí)候join api是窄依賴)。

常見的寬依賴有g(shù)roupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是寬依賴)。

9、DAG:有向無環(huán)圖

Directed Acycle graph,反應(yīng)RDD之間的依賴關(guān)系,如圖所示:

image

10、DAGScheduler:有向無環(huán)圖調(diào)度器

基于DAG劃分Stage 并以TaskSet的形勢(shì)提交Stage給TaskScheduler;負(fù)責(zé)將作業(yè)拆分成不同階段的具有依賴關(guān)系的多批任務(wù);最重要的任務(wù)之一就是:計(jì)算作業(yè)和任務(wù)的依賴關(guān)系,制定調(diào)度邏輯。在SparkContext初始化的過程中被實(shí)例化,一個(gè)SparkContext對(duì)應(yīng)創(chuàng)建一個(gè)DAGScheduler。

image

11、TaskScheduler:任務(wù)調(diào)度器

將Taskset提交給worker(集群)運(yùn)行并回報(bào)結(jié)果;負(fù)責(zé)每個(gè)具體任務(wù)的實(shí)際物理調(diào)度。如圖所示:

image

12、Job:作業(yè)

由一個(gè)或多個(gè)調(diào)度階段所組成的一次計(jì)算作業(yè);包含多個(gè)Task組成的并行計(jì)算,往往由Spark Action催生,一個(gè)JOB包含多個(gè)RDD及作用于相應(yīng)RDD上的各種Operation。如圖所示:

image

13、Stage:調(diào)度階段

一個(gè)任務(wù)集對(duì)應(yīng)的調(diào)度階段;每個(gè)Job會(huì)被拆分很多組Task,每組任務(wù)被稱為Stage,也可稱TaskSet,一個(gè)作業(yè)分為多個(gè)階段;Stage分成兩種類型ShuffleMapStage、ResultStage。如圖所示:

image

14、TaskSet:任務(wù)集

由一組關(guān)聯(lián)的,但相互之間沒有Shuffle依賴關(guān)系的任務(wù)所組成的任務(wù)集。如圖所示:

image

提示:

1)一個(gè)Stage創(chuàng)建一個(gè)TaskSet;

2)為Stage的每個(gè)Rdd分區(qū)創(chuàng)建一個(gè)Task,多個(gè)Task封裝成TaskSet

15、Task:任務(wù)

被送到某個(gè)Executor上的工作任務(wù);單個(gè)分區(qū)數(shù)據(jù)集上的最小處理流程單元。如圖所示:

image

總體如圖所示:

image

二 Spark的任務(wù)提交機(jī)制

image

作業(yè)執(zhí)行流程描述:

1、客戶端啟動(dòng)后直接運(yùn)行用戶程序,啟動(dòng)Driver相關(guān)的工作:DAGScheduler和BlockManagerMaster等。

2、客戶端的Driver向Master注冊(cè)。

3、Master還會(huì)讓W(xué)orker啟動(dòng)Exeuctor。Worker創(chuàng)建一個(gè)ExecutorRunner線程,ExecutorRunner會(huì)啟動(dòng)ExecutorBackend進(jìn)程。

4、ExecutorBackend啟動(dòng)后會(huì)向Driver的SchedulerBackend注冊(cè)。Driver的DAGScheduler解析作業(yè)并生成相應(yīng)的Stage,每個(gè)Stage包含的Task通過TaskScheduler分配給Executor執(zhí)行。

5、所有stage都完成后作業(yè)結(jié)束。

簡單理解:

首先Driver和master通信(提交任務(wù),申請(qǐng)資源,傳送driverUrl地址)如 spark-submit xxx.jar --total-executor-cores 2 --executor-memory 512,該命令執(zhí)行后master會(huì)根據(jù)提交的信息申請(qǐng)資源;

master主要做幾件事情:1拿出所有workers上的資源;2按照資源的大小進(jìn)行排序;3按照排序順序取資源;4讓worker啟動(dòng)executor。

最后把任務(wù)換分為stage,將stage添加到taskSet中。循環(huán)taskset,將task下發(fā)。

image

Spark在不同集群中的運(yùn)行架構(gòu)

Spark 注重建立良好的生態(tài)系統(tǒng),它不僅支持多種外部文件存儲(chǔ)系統(tǒng),提供了多種多樣的集群運(yùn)行模式。部署在單臺(tái)機(jī)器上時(shí),既可以用本地(Local)模式運(yùn)行,也 可以使用偽分布式模式來運(yùn)行;當(dāng)以分布式集群部署的時(shí)候,可以根據(jù)自己集群的實(shí)際情況選擇Standalone模式(Spark自帶的模式)、YARN- Client模式或者YARN-Cluster模式。Spark的各種運(yùn)行模式雖然在啟動(dòng)方式、運(yùn)行位置、調(diào)度策略上各有不同,但它們的目的基本都是一致 的,就是在合適的位置安全可靠的根據(jù)用戶的配置和Job的需要運(yùn)行和管理Task。

** Spark on Standalone運(yùn)行過程**

Standalone 模式是Spark實(shí)現(xiàn)的資源調(diào)度框架,其主要的節(jié)點(diǎn)有Client節(jié)點(diǎn)、Master節(jié)點(diǎn)和Worker節(jié)點(diǎn)。其中Driver既可以運(yùn)行在Master 節(jié)點(diǎn)上中,也可以運(yùn)行在本地Client端。當(dāng)用spark-shell交互式工具提交Spark的Job時(shí),Driver在Master節(jié)點(diǎn)上運(yùn)行;當(dāng) 使用spark-submit工具提交Job或者在Eclips、IDEA等開發(fā)平臺(tái)上使用”new SparkConf.setManager(“spark://master:7077”)”方式運(yùn)行Spark任務(wù)時(shí),Driver是運(yùn)行在本地 Client端上的。
其運(yùn)行過程如下:

1.SparkContext連接到Master,向Master注冊(cè)并申請(qǐng)資源(CPU Core 和Memory);
2.Master根據(jù)SparkContext的資源申請(qǐng)要求和Worker心跳周期內(nèi)報(bào)告的信息決定在哪個(gè)Worker上分配資源,然后在該Worker上獲取資源,然后啟動(dòng)StandaloneExecutorBackend;
3.StandaloneExecutorBackend向SparkContext注冊(cè);
4.SparkContext將Applicaiton代碼發(fā)送給StandaloneExecutorBackend;并且SparkContext解 析Applicaiton代碼,構(gòu)建DAG圖,并提交給DAG Scheduler分解成Stage(當(dāng)碰到Action操作時(shí),就會(huì)催生Job;每個(gè)Job中含有1個(gè)或多個(gè)Stage,Stage一般在獲取外部數(shù)據(jù) 和shuffle之前產(chǎn)生),然后以Stage(或者稱為TaskSet)提交給Task Scheduler,Task Scheduler負(fù)責(zé)將Task分配到相應(yīng)的Worker,最后提交給StandaloneExecutorBackend執(zhí)行;
5.StandaloneExecutorBackend會(huì)建立Executor線程池,開始執(zhí)行Task,并向SparkContext報(bào)告,直至Task完成。
6.所有Task完成后,SparkContext向Master注銷,釋放資源。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容