https://blog.csdn.net/lovechendongxing/article/details/81746988
Spark應用程序以進程集合為單位在分布式集群上運行,通過driver程序的main方法創建的SparkContext對象與集群交互。
1、Spark通過SparkContext向Cluster manager(資源管理器)申請所需執行的資源(cpu、內存等)
2、Cluster manager分配應用程序執行需要的資源,在Worker節點上創建Executor
3、SparkContext 將程序代碼(jar包或者python文件)和Task任務發送給Executor執行,並收集結果給Driver。
圖1 Spark運行原理圖
Spark詳細運行過程如下圖
圖2 Spark運行詳細流程
圖3 Spark運行流程描述
涉及的幾個定義和詳細的運行過程如下:
1、Application:Spark應用程序
指的是用戶編寫的Spark應用程序,包含了Driver功能代碼和分布在集群中多個節點上運行的Executor代碼。
Spark應用程序,由一個或多個作業JOB組成,如下圖所示。
圖4 Spark應用程序組成
2、Driver:驅動程序
Spark中的Driver即運行上述Application的Main()函數並且創建SparkContext,其中創建SparkContext的目的是為了准備Spark應用程序的運行環境。在Spark中由SparkContext負責和ClusterManager通信,進行資源的申請、任務的分配和監控等;當Executor部分運行完畢后,Driver負責將SparkContext關閉。通常SparkContext代表Driver,如下圖所示。
圖5 Driver驅動程序組成
3、Cluster Manager:資源管理器
指的是在集群上獲取資源的外部服務,常用的有:Standalone,Spark原生的資源管理器,由Master負責資源的分配;Haddop Yarn,由Yarn中的ResearchManager負責資源的分配;Messos,由Messos中的Messos Master負責資源管理。
4、Executor:執行器
Application運行在Worker節點上的一個進程,該進程負責運行Task,並且負責將數據存在內存或者磁盤上,每個Application都有各自獨立的一批Executor,如下圖所示。
圖6 Executor運行原理
5、Worker:計算節點
集群中任何可以運行Application代碼的節點,類似於Yarn中的NodeManager節點。在Standalone模式中指的就是通過Slave文件配置的Worker節點,在Spark on Yarn模式中指的就是NodeManager節點,在Spark on Messos模式中指的就是Messos Slave節點,如下圖所示。
圖7 Worker運行原理
6、DAGScheduler:有向無環圖調度器
基於DAG划分Stage 並以TaskSet的形勢提交Stage給TaskScheduler;負責將作業拆分成不同階段的具有依賴關系的多批任務;最重要的任務之一就是:計算作業和任務的依賴關系,制定調度邏輯。在SparkContext初始化的過程中被實例化,一個SparkContext對應創建一個DAGScheduler。
圖8 DAGScheduler圖解
7、TaskScheduler:任務調度器
將Taskset提交給worker(集群)運行並回報結果;負責每個具體任務的實際物理調度。如圖所示。
圖9 TaskScheduler圖解
8、Job:作業
由一個或多個調度階段所組成的一次計算作業;包含多個Task組成的並行計算,往往由Spark Action催生,一個JOB包含多個RDD及作用於相應RDD上的各種Operation。如圖所示。
圖10 Job圖解
9、Stage:調度階段
一個任務集對應的調度階段;每個Job會被拆分很多組Task,每組任務被稱為Stage,也可稱TaskSet,一個作業分為多個階段;Stage分成兩種類型ShuffleMapStage、ResultStage。如圖所示。
圖11 Stage圖解
Application多個job多個Stage:Spark Application中可以因為不同的Action觸發眾多的job,一個Application中可以有很多的job,每個job是由一個或者多個Stage構成的,后面的Stage依賴於前面的Stage,也就是說只有前面依賴的Stage計算完畢后,后面的Stage才會運行。
划分依據:Stage划分的依據就是寬依賴,何時產生寬依賴,reduceByKey, groupByKey等算子,會導致寬依賴的產生。
核心算法:從后往前回溯,遇到窄依賴加入本stage,遇見寬依賴進行Stage切分。Spark內核會從觸發Action操作的那個RDD開始從后往前推,首先會為最后一個RDD創建一個stage,然后繼續倒推,如果發現對某個RDD是寬依賴,那么就會將寬依賴的那個RDD創建一個新的stage,那個RDD就是新的stage的最后一個RDD。然后依次類推,繼續繼續倒推,根據窄依賴或者寬依賴進行stage的划分,直到所有的RDD全部遍歷完成為止。
將DAG划分為Stage剖析:如上圖,從HDFS中讀入數據生成3個不同的RDD,通過一系列transformation操作后再將計算結果保存回HDFS。可以看到這個DAG中只有join操作是一個寬依賴,Spark內核會以此為邊界將其前后划分成不同的Stage. 同時我們可以注意到,在圖中Stage2中,從map到union都是窄依賴,這兩步操作可以形成一個流水線操作,通過map操作生成的partition可以不用等待整個RDD計算結束,而是繼續進行union操作,這樣大大提高了計算的效率。
10、TaskSet:任務集
由一組關聯的,但相互之間沒有Shuffle依賴關系的任務所組成的任務集。如圖所示。
圖12 Stage圖解
提示:
1)一個Stage創建一個TaskSet;
2)為Stage的每個Rdd分區創建一個Task,多個Task封裝成TaskSet
11、Task:任務
被送到某個Executor上的工作任務;單個分區數據集上的最小處理流程單元(單個stage內部根據操作數據的分區數划分成多個task)。如圖所示。
圖13 Task圖解
總體如圖所示:
圖14 匯總圖解