本文以Spark執行模式中最常見的集群模式為例,詳細的描述一下Spark程序的生命周期(YARN作為集群管理器)。
1、集群節點初始化
集群剛初始化的時候,或者之前的Spark任務完成之后,此時集群中的節點都處於空閑狀態,每個服務器(節點)上,只有YARN的進程在運行(環境進程不在此考慮范圍內),集群狀態如下所示:
每個節點服務器上都有一個YARN的管理器進程在檢測着服務器的狀態。藍色的是YARN主節點。
2、創建Spark驅動器進程
如上圖所示,客戶端將程序包(jar包或代碼庫)提交到集群管理器的驅動節點(即master節點),此時驅動節點會給Spark驅動器進程申請資源,並將其在某一個節點服務器上啟動起來。程序包也發給Spark驅動器。
注意此時只有Spark的驅動器Driver進程,執行器Executor進程還未創建。
3、創建Spark集群
Spark的Driver進程啟動后,開始執行用戶代碼。用戶代碼中會先初始化包含Spark集群信息的SparkSession,該SparkSession中就存有執行器所需資源的配置信息,它會與集群管理器的master進程通信(下圖實線箭頭),要求集群管理器在集群上啟動所需要Spark的Executor(下圖虛線箭頭)。集群管理器按要求啟動完Executor之后,會將啟動的Executor及其所在節點信息發送給Spark的Driver進程,后面將由Spark的Driver對所有的Executor進程進行操控。這就構建出來了一個Spark集群。
4、執行Spark程序
由於Spark的Driver進程已經從集群管理器處獲取到了所有可以調度的Executor信息,下面就開始執行代碼了,如下圖所示。
Spark的Driver進程與Executor進程互相通信,下發task和反饋執行結果,直到程序代碼執行完成或異常退出。
5、結束運行
當Spark程序執行完成之后,Driver進程會發消息給集群管理器的Master節點告知執行結果(下圖箭頭1),集群管理器會關閉該Spark驅動器對應的Executor進程。至此,資源全部被回收,Spark集群完成本次任務,用戶可以通過集群管理器得到Spark任務的執行結果。
Spark集群資源完全釋放之后,就又進入了第一步中的集群節點初始化的狀態,等待下一個Spark任務的到來。