1. 程式人生 > >大話Spark(5)-三圖詳述Spark Standalone/Client/Cluster執行模式

大話Spark(5)-三圖詳述Spark Standalone/Client/Cluster執行模式

之前在 大話Spark(2)裡講過Spark Yarn-Client的執行模式,有同學反饋與Cluster模式沒有對比, 這裡我重新整理了三張圖分別看下Standalone,Yarn-Client 和 Yarn-Cluster的執行流程。

1、獨立(Standalone)執行模式

獨立執行模式是Spark自身實現的資源排程框架,由客戶端、Master節點和多個Worker節點組成。其中SparkContext既可以執行在Master節點上,也可以執行在客戶端。
Worker節點可以通過ExecutorRunner執行在當前節點上的CoarseGrainedExecutorBackend程序,每個Worker節點上存在一個或多個CoarseGrainedExecutorBackend程序,每個程序包含一個Executor物件。 該物件持有一個執行緒池,每個執行緒可以執行一個task。
如上圖獨立模式執行流程圖所示:

  1. 啟動應用程式,在SparkContext啟動過程中,先初始化DAGScheduler 和 TaskSchedulerImpl兩個排程器, 同時初始化SparkDeploySchedulerBackend,並在其內部啟動DriverEndpoint 和 ClientEndpoint
  2. ClientEndpoint向Master註冊應用程式。Master收到註冊訊息後把應用放到待執行應用列表,使用自己的資源排程演算法分配Worker資源給應用程式。
  3. 應用程式獲得Worker時,Master會通知Worker中的WorkerEndpoint建立CoarseGrainedExecutorBackend程序,在該程序中建立執行容器Executor。
  4. Executor建立完畢後傳送訊息到Master 和 DriverEndpoint。在SparkContext建立成功後, 等待Driver端發過來的任務。
  5. SparkContext分配任務給CoarseGrainedExecutorBackend執行,在Executor上按照一定排程執行任務(這些任務就是自己寫的程式碼)
  6. CoarseGrainedExecutorBackend在處理任務的過程中把任務狀態傳送給SparkContext,SparkContext根據任務不同的結果進行處理。如果任務集處理完畢後,則繼續傳送其他任務集。
  7. 應用程式執行完成後,SparkContext會進行資源回收。

補充

  1. SparkContext對任務的劃分:每個Action操作都會觸發一個job,job給到DAGScheduler,DAGScheduler把job劃分成多個Stage(Stage劃分演算法),每個Stage建立一個Taskset, TaskSet提交給TaskScheduler,把這些task分配到之前註冊來的executor上。
  2. task的型別分為ShuffleMapTask 和 ResultTask, 只有最後一個task是ResultTask。每一個task針對rdd的一個partition並行執行, 一個stage的task會連續執行一個後續運算元。

2、Yarn-Client執行模式


Yarn-Client工作流程如上圖所示:

  1. 啟動應用程式,在SparkContext啟動過程中, 初始化DAGScheduler排程器,使用反射方法初始化YarnScheduler 和 YarnClientSchedulerBackend。YarnClientSchedulerBackend內部啟動DriverEndpoint 和 Client。Client向Yarn叢集的ResourceManager申請啟動Application Master。
  2. ResourceManager收到請求後,在叢集中選一個NodeManger,為此應用申請一個Container, 並在其中啟動Application Master。前面講過,Client模式中的ApplicationMaster不執行SparkContext,只與SparkContext進行聯絡進行資源的派分。
  3. SparkContext啟動完畢後,與Application Master通訊,向Resource Manager註冊, 根據任務資訊申請Container資源。
  4. Application Master申請到資源後,與NodeManager通訊,在Container中啟動YarnClientSchedulerBackend,YarnClientSchedulerBackend向客戶端中的SparkContext註冊並申請taskset。
  5. SparkContext和執行中的任務保持通訊,獲取任務的狀態和進度,隨時掌握各個任務的執行狀況,可以在任務失敗時重啟任務。
  6. 應用程式執行完成後,SparkContext向ResourceManager申請登出並關閉自己。

3、Yarn-Cluster執行模式


Yarn-Cluster工作流程如上圖所示:

  1. 客戶端啟動Client項YARN叢集提交應用程式。
  2. ResourceManager收到請求後,再叢集中選一個NodeManger,為此應用申請一個Container, 並在其中啟動Application Master。在Application Master中進行SparkContext的初始化操作
  3. Application Master向ResourceManager註冊,為各個任務申請資源,並監控任務的執行狀態直到結束
  4. Application Master申請到資源後,與NodeManager通訊,在Container中啟動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend向客戶端中的SparkContext註冊並申請taskset。
  5. CoarseGrainedExecutorBackend執行任務並向Application Master彙報執行的狀態和進度.
  6. 應用程式執行完成後,SparkContext向ResourceManager申請登出並關閉。

小結

Spark雖然有多種執行模式,但是其執行架構基本上由三部分組成,

  • SparkContext
  • ClusterManager(叢集資源管理器)
  • Executor(任務執行程序)

SparkContext用於負責與ClusterManager通訊,進行資源的申請、任務的分配和監控等,負責作業執行的全生命週期管理。
ClusterManager提供了資源的分配和管理,不同模式下角色有所不同。Standalone模式下由Master提供,Yarn模式下由ResourceManager擔