1. 名詞解釋:
作業相關的名詞解釋
Application:Spark Application的概念和Hadoop MapReduce中的類似,指的是用戶編寫的Spark應用程序,包含了一個Driver 功能的代碼和分布在集群中多個節點上運行的Executor代碼
Driver:Spark中的Driver即運行上述Application的main()函數并且創建SparkContext,其中創建SparkContext的目的是為了準備Spark應用程序的運行環境。在Spark中由SparkContext負責和ClusterManager通信,進行資源的申請、任務的分配和監控等;當Executor部分運行完畢后,Driver負責將SparkContext關閉。通常用SparkContext代表Drive
Executor:Application運行在Worker 節點上的一個進程,該進程負責運行Task,并且負責將數據存在內存或者磁盤上,每個Application都有各自獨立的一批Executor。在Spark on Yarn模式下,其進程名稱為CoarseGrainedExecutorBackend,類似于Hadoop MapReduce中的YarnChild。一個CoarseGrainedExecutorBackend進程有且僅有一個executor對象,它負責將Task包裝成taskRunner,并從線程池中抽取出一個空閑線程運行Task。每個CoarseGrainedExecutorBackend能并行運行Task的數量就取決于分配給它的CPU的個數了
-
Cluster Manager:指的是在集群上獲取資源的外部服務,目前有:
- Standalone:Spark原生的資源管理,由Master負責資源的分配
- Hadoop Yarn:由YARN中的ResourceManager負責資源的分配
Worker:集群中任何可以運行 Application 代碼的節點,類似于 YARN 中的 NodeManager 節點。在 Standalone 模式中指的就是通過 Slave 文件配置的 Worker 節點,在 Spark on Yarn 模式中指的就是 NodeManager 節點
作業(Job):包含多個Task組成的并行計算,往往由Spark Action催生,一個JOB包含多個RDD及作用于相應RDD上的各種Operation
階段(Stage):每個Job會被拆分很多組Task,每組任務被稱為Stage,也可稱TaskSet,一個作業分為多個階段
任務(Task): 被送到某個Executor上的工作任務
提交作業有四種方式,分別是 Driver運行在 Worker 上,Driver 運行在客戶端,yarn client 模式和 yarn cluster 模式
2. Driver 運行在 Worker 上的執行流程

作業執行流程描述:
客戶端提交作業給Master
Master讓一個Worker啟動Driver,即SchedulerBackend。Worker創建一個DriverRunner線程,DriverRunner啟動SchedulerBackend進程。
另外Master還會讓其余Worker啟動Exeuctor,即ExecutorBackend。Worker創建一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。
ExecutorBackend啟動后會向Driver的SchedulerBackend注冊。SchedulerBackend進程中包含DAGScheduler,它會根據用戶程序,生成執行計劃,并調度執行。對于每個stage的task,都會被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend匯報的時候把TaskScheduler中的task調度到ExecutorBackend執行。
所有stage都完成后作業結束。
3. Driver 運行在客戶端

作業執行流程描述:
客戶端啟動后直接運行用戶程序,啟動Driver相關的工作:DAGScheduler和BlockManagerMaster等。
客戶端的Driver向Master注冊。
Master還會讓Worker啟動Exeuctor。Worker創建一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。
ExecutorBackend啟動后會向Driver的SchedulerBackend注冊。Driver的DAGScheduler解析作業并生成相應的Stage,每個Stage包含的Task通過TaskScheduler分配給Executor執行。
所有stage都完成后作業結束。
4. 基于 YARN 的 Spark 架構與作業執行流程
4.1 Yarn-Client 模式
Spark Yarn Client向YARN的ResourceManager申請啟動Application Master。同時在SparkContent初始化中將創建DAGScheduler和TASKScheduler等,由于我們選擇的是Yarn-Client模式,程序會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend;
ResourceManager收到請求后,在集群中選擇一個NodeManager,為該應用程序分配第一個Container,要求它在這個Container中啟動應用程序的ApplicationMaster,與YARN-Cluster區別的是在該ApplicationMaster不運行SparkContext,只與SparkContext進行聯系進行資源的分派;
Client中的SparkContext初始化完畢后,與ApplicationMaster建立通訊,向ResourceManager注冊,根據任務信息向ResourceManager申請資源(Container);
一旦ApplicationMaster申請到資源(也就是Container)后,便與對應的NodeManager通信,要求它在獲得的Container中啟動啟動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟動后會向Client中的SparkContext注冊并申請Task;
Client中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task并向Driver匯報運行的狀態和進度,以讓Client隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務;
應用程序運行完成后,Client的SparkContext向ResourceManager申請注銷并關閉自己。
4.2 YARN-Cluster 模式
在YARN-Cluster模式中,當用戶向YARN中提交一個應用程序后,YARN將分兩個階段運行該應用程序:第一個階段是把Spark的Driver作為一個ApplicationMaster在YARN集群中先啟動;第二個階段是由ApplicationMaster創建應用程序,然后為它向ResourceManager申請資源,并啟動Executor來運行Task,同時監控它的整個運行過程,直到運行完成。
Spark Yarn Client向YARN中提交應用程序,包括ApplicationMaster程序、啟動ApplicationMaster的命令、需要在Executor中運行的程序等;
ResourceManager收到請求后,在集群中選擇一個NodeManager,為該應用程序分配第一個Container,要求它在這個Container中啟動應用程序的ApplicationMaster,其中ApplicationMaster進行SparkContext等的初始化;
ApplicationMaster向ResourceManager注冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態,然后它將采用輪詢的方式通過RPC協議為各個任務申請資源,并監控它們的運行狀態直到運行結束;
一旦ApplicationMaster申請到資源(也就是Container)后,便與對應的NodeManager通信,要求它在獲得的Container中啟動啟動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟動后會向ApplicationMaster中的SparkContext注冊并申請Task。這一點和Standalone模式一樣,只不過SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務的調度,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏輯等;
ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task并向ApplicationMaster匯報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務;
應用程序運行完成后,ApplicationMaster向ResourceManager申請注銷并關閉自己。
4.3 YARN-Client 與 YARN-Cluster 區別
理解YARN-Client和YARN-Cluster深層次的區別之前先清楚一個概念:Application Master。在YARN中,每個Application實例都有一個ApplicationMaster進程,它是Application啟動的第一個容器。它負責和ResourceManager打交道并請求資源,獲取資源之后告訴NodeManager為其啟動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的區別其實就是ApplicationMaster進程的區別。
YARN-Cluster模式下,Driver運行在AM(Application Master)中,它負責向YARN申請資源,并監督作業的運行狀況。當用戶提交了作業之后,就可以關掉Client,作業會繼續在YARN上運行,因而YARN-Cluster模式不適合運行交互類型的作業;
YARN-Client模式下,Application Master僅僅向YARN請求Executor,Client會和請求的Container通信來調度他們工作,也就是說Client不能離開。