1. 程式人生 > >Spark:核心架構深度剖析

Spark:核心架構深度剖析

1、 術語定義

1、Application:Spark應用程式
指的是使用者編寫的Spark應用程式,包含了Driver功能程式碼和分佈在叢集中多個節點上執行的Executor程式碼。

Spark應用程式,由一個或多個作業JOB組成,如下圖所示:
在這裡插入圖片描述

2、Driver:驅動程式
Spark中的Driver即執行上述Application的Main()函式並且建立SparkContext,其中建立SparkContext的目的是為了準備Spark應用程式的執行環境。在Spark中由SparkContext負責和ClusterManager通訊,進行資源的申請、任務的分配和監控等;當Executor部分執行完畢後,Driver負責將SparkContext關閉。通常SparkContext代表Driver,如下圖所示:
在這裡插入圖片描述

3、Cluster Manager:資源管理器
指的是在叢集上獲取資源的外部服務。目前有三種類型,目前有三種類型:

  1. Standalon : spark原生的資源管理,由Master負責資源的分配
  2. Apache Mesos:與hadoop MR相容性良好的一種資源排程框架
  3. Hadoop Yarn: 主要是指Yarn中的ResourceManager

如下圖所示:
在這裡插入圖片描述

4、Executor:執行器
某個Application執行在worker節點上的一個程序, 該程序負責執行某些Task, 並且負責將資料存到記憶體或磁碟上,每個Application都有各自獨立的一批Executor, 在Spark on Yarn模式下,其程序名稱為CoarseGrainedExecutor Backend。一個CoarseGrainedExecutor Backend有且僅有一個Executor物件, 負責將Task包裝成taskRunner,並從執行緒池中抽取一個空閒執行緒執行Task, 這個每一個oarseGrainedExecutor Backend能並行執行Task的數量取決與分配給它的cpu個數 如下圖所示:
在這裡插入圖片描述

5、Worker:計算節點
叢集中任何可以執行Application程式碼的節點,類似於Yarn中的NodeManager節點。在Standalone模式中指的就是通過Slave檔案配置的Worker節點,在Spark on Yarn模式中指的就是NodeManager節點,在Spark on Messos模式中指的就是Messos Slave節點,如下圖所示:
在這裡插入圖片描述

6、RDD:彈性分散式資料集
Spark的基本計算單元,可以通過一系列運算元進行操作(主要有Transformation和Action操作),如下圖所示:
在這裡插入圖片描述

7、窄依賴
父RDD每一個分割槽最多被一個子RDD的分割槽所用;表現為一個父RDD的分割槽對應於一個子RDD的分割槽,或兩個父RDD的分割槽對應於一個子RDD 的分割槽。如圖所示:
在這裡插入圖片描述

常見的窄依賴有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被呼叫的RDD API是寬依賴(存在shuffle), 而且兩個join的RDD的分割槽數量一致,join結果的rdd分割槽數量也一樣,這個時候join api是窄依賴)。

8、寬依賴
父RDD的每個分割槽都可能被多個子RDD分割槽所使用,子RDD分割槽通常對應所有的父RDD分割槽。如圖所示:在這裡插入圖片描述
常見的寬依賴有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是寬依賴)。

9、DAG:有向無環圖
Directed Acycle graph,反應RDD之間的依賴關係,如圖所示:
在這裡插入圖片描述

10、DAGScheduler:有向無環圖排程器
基於DAG劃分Stage 並以TaskSet的形勢提交Stage給TaskScheduler;負責將作業拆分成不同階段的具有依賴關係的多批任務;最重要的任務之一就是:計算作業和任務的依賴關係,制定排程邏輯。在SparkContext初始化的過程中被例項化,一個SparkContext對應建立一個DAGScheduler。
在這裡插入圖片描述

11、TaskScheduler:任務排程器
將Taskset提交給worker(叢集)執行並回報結果;負責每個具體任務的實際物理排程。如圖所示:
在這裡插入圖片描述

12、Job:作業
由一個或多個排程階段所組成的一次計算作業;包含多個Task組成的平行計算,往往由Spark Action催生,一個JOB包含多個RDD及作用於相應RDD上的各種Operation。如圖所示:
在這裡插入圖片描述

13、Stage:排程階段
一個任務集對應的排程階段;每個Job會被拆分很多組Task,每組任務被稱為Stage,也可稱TaskSet,一個作業分為多個階段;Stage分成兩種型別ShuffleMapStage、ResultStage。如圖所示:
在這裡插入圖片描述

14、TaskSet:任務集
由一組關聯的,但相互之間沒有Shuffle依賴關係的任務所組成的任務集。如圖所示:
在這裡插入圖片描述

提示:

  • 一個Stage建立一個TaskSet;
  • 為Stage的每個Rdd分割槽建立一個Task,多個Task封裝成TaskSet

15、Task:任務
被送到某個Executor上的工作任務;單個分割槽資料集上的最小處理流程單元。如圖所示:
在這裡插入圖片描述

2、Spark核心架構深度剖析

在這裡插入圖片描述
執行的流程如下:

  1. 首先是提交打包的應用程式,使用Spark submit或者spark shell工具執行。
  2. 提交應用程式後後臺會在後臺啟動Driver程序(注意:這裡的Driver是在Client上啟動,如果使用cluster模式提交任務,Driver程序會在Worker節點啟動)。
  3. 開始構建Spark應用上下文。一般的一個Spark應用程式都會先建立一個SparkConf,然後來建立SparkContext。如下程式碼所示:val conf=new SparkConf() val sc=new SparkContext(conf)。在建立SparkContext物件時有兩個重要的物件,DAGScheduler和TaskScheduler。
  4. 構建好TaskScheduler後,它對應著一個後臺程序,接著它會去連線Master叢集,向Master叢集註冊Application。
  5. Master節點接收到應用程式之後,會向該Application分配資源,啟動一個或者多個Worker節點。
  6. 每一個Worker節點會為該應用啟動一個Executor程序來執行該應用程式。
  7. 向Master節點註冊應用之後,Master為應用分配了節點資源,在Worker啟動Executor完成之後,此時,Executor會向TaskScheduler反向註冊,以讓它知道Master為應用程式分配了哪幾臺Worker節點和Executor程序來執行任務。到此時為止,整個SparkContext建立完成。
  8. 建立好SparkContext之後,繼續執行我們的應用程式,每執行一個action操作就建立為一個job,將job交給DAGScheduler執行,然後DAGScheduler會將多個job劃分為stage(stage劃分演算法)。然後每一個stage建立一個TaskSet。
  9. 實際上TaskScheduler有自己的後臺程序會處理建立好的TaskSet。
  10. 然後就會將TaskSet中的每一個task提交到Executor上去執行。(task分配演算法)
  11. Executor會建立一個執行緒池,當executor接收到一個任務時就從執行緒池中拿出來一個執行緒將Task封裝為一個TaskRunner。
  12. 在TaskRunner中會將我們程式的拷貝,反序列化等操作,然後執行每一個Task。對於這個Task一般有兩種,ShufflerMapTask和ResultTask,只有最後一個stage的task是ResultTask,其它的都是ShufflerMapTask。
  13. 最後會執行完所有的應用程式,將stage的每一個task分批次提交到executor中去執行,每一個Task針對一個RDD的partition,執行我們定義的運算元和函式,直到全部執行完成。