Spark的基本概念:
(1)Application:表示你的應用程式
(2)Driver:表示main()函數,建立SparkContext。由SparkContext負責與ClusterManager通訊,進行資源的申請,任務的分配和監控等。程式執行完畢後關閉SparkContext
(3)Executor:某個Application運行在Worker節點上的一個進程,該進程負責運行某些task,並且負責將資料存在記憶體或者磁碟上。在Spark on Yarn模式下,其進程名稱為 CoarseGrainedExecutor Backend,一個CoarseGrainedExecutor Backend進程有且僅有一個executor對象,它負責將Task封裝成taskRunner,並從線程池中抽取出一個空閑線程運行Task,這樣,每個CoarseGrainedExecutorBackend能並行運行Task的資料就取決於分配給它的CPU的個數。
(4)Worker:叢集中可以運行Application代碼的節點。在Standalone模式中指的是通過slave檔案配置的worker節點,在Spark on Yarn模式中指的就是NodeManager節點。
(5)Task:在Executor進程中執行任務的工作單元,多個Task組成一個Stage
(6)Job:包含多個Task組成的並行計算,是由Action行為觸發的
(7)Stage:每個Job會被拆分很多組Task,作為一個TaskSet,其名稱為Stage
(8)DAGScheduler:根據Job構建基於Stage的DAG,並提交Stage給TaskScheduler,其劃分Stage的依據是RDD之間的依賴關係
(9)TaskScheduler:將TaskSet提交給Worker(叢集)運行,每個Executor運行什麼Task就是在此處分配的。
Spark的執行流程:
Spark在進行transformation計算的時候,不會觸發Job ,只有執行action操作的時候,才會觸發Job,在Driver中SparkContext根據RDD之間的依賴關聯建立出DAG有向非循環圖,DAGScheduler負責解析這個圖,解析時是以Shuffle為邊界,反向解析,構建stage。將多個任務根據依賴關係劃分為不同的Stage,將每個Stage的Taste Set 提交給TaskScheduler去執行,任務會在Executor進程的多個Task線程上執行,完成Task任務後 將結果資訊提交到ExecutorBackend中 他會將資訊提交給TaskScheduler。
TaskScheduler接到訊息後通知TaskManager,移除該Task任務,開始執行下一個任務。TaskScheduler同時會將資訊同步到TaskSet Manager中一份,全部任務執行完畢後TaskSet Manager將結果反饋給DAGScheduler,如果屬於ResultTask 會交給JobListener。否則話全部任務執行完畢後寫入資料。
Driver運行在Worker:
(1)用戶端提交作業給Master
(2)Master讓一個Worker啟動Driver,即SchedulerBackend。Worker建立一個DriverRunner線程,DriverRunner啟動SchedulerBackend線程。
(3)另外Master還會讓其餘Worker啟動Executor,即ExecutorBackend。Worker建立一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。
(4)ExecutorBackend啟動後會向Driver的SchedulerBackend註冊,SchedulerBackend進程中包含DAGScheduler,ExecutorBackend向SchedulerBackend彙報的時候把TaskScheduler中的Task調度到ExecutorBackend執行。
(5)所有stage都完成後作業結束
Spark運行架構的特點:
每個Application擷取專屬的Executor進程,該進程在Application期間一直駐留,並以多線程方式運行tasks。這種Application隔離機制有其優勢,無論是從調度角度看(每個Driver調度它自己的任務),還是從運行角度看(來自不同Application的Task運行在不同的JVM中)。當前,這也意味著SparkApplication不能跨應用程式共用資料,除非將資料寫入到外部儲存系統。
提交SparkContext的Client應該靠近Worker節點(運行Executor)的節點,最好是在同一個Rack裡,因為SparkApplication運行過程中SparkContext和Executor之間有大量的資訊交換,如果想在遠程叢集中運行,最好使用RPC將SparkContext提交給叢集