Spark作為當前主流的分布式計算框架,其高效性、通用性、易用性使其得到廣泛的關注,本系列博客不會介紹其原理、安裝與使用相關知識,將會從源碼角度進行深度分析,理解其背后的設計精髓,以便后續在Spark使用以及設計類似產品提供相關經驗,下面開始進入正題。
本系列博客將從集群各端點的設計原理、通信方式、啟動流程,以及用戶任務提交后,任務的集群加載、分解、調度的方式兩個方面進行解讀。
首先,從腳本開始
詳見《【Spark2.0源碼學習】-2.一切從腳本說起》
其次,在集群各端點的設計原理、通信方式、啟動方面
Spark集群由若干節點構成,而每個節點都是可以接受與發送消息的RPC服務端點(終端 ,英文:Endpoint),根據責任的不同可以分為三類端點:Client、Master、Worker,三端調用關系:

- Client: Spark任務節點,負責發布,查詢,以及中止任務的相關進程的統稱,Client是運行時有效進程,如果相關任務處理完成,對應的進程結束
- Master: Spark管理節點,負責管理Worker進程,協調調度Client發布的任務處理,Master節點可以為多個,有且僅能有一個為acitvity狀態,其他為standby狀態
- Worker: Spark工作節點,負責具體的任務執行工作
我們將在如下章節逐步介紹:
《【Spark2.0源碼學習】-3.Endpoint模型介紹》
《【Spark2.0源碼學習】-4.Master啟動》
《【Spark2.0源碼學習】-5.Worker啟動》
《【Spark2.0源碼學習】-6.Client啟動》
最后,在任務的集群加載、分解、調度方面
基於三端模型,用戶通過spark-submit提交或者運行spark-shell REPL,集群創建Driver,Driver加載Application,最后Application根據用戶代碼轉化為RDD,RDD分解為Tasks,Executor執行Task等系列知識,整體交互藍圖如下:

(注:如果不能完全理解,可在閱讀完相關章節后再回來理解)
- Client運行時向Master發送啟動驅動申請(發送RequestSubmitDriver指令)
- Master調度可用Worker資源進行驅動安裝(發送LaunchDriver指令)
- Worker運行DriverRunner進行驅動加載,並向Master發送應用注冊請求(發送RegisterApplication指令)
- Master調度可用Worker資源進行應用的Executor安裝(發送LaunchExecutor指令)
- Executor安裝完畢后向Driver注冊驅動可用Executor資源(發送RegisterExecutor指令)
- 最后是運行用戶代碼時,通過DAGScheduler,TaskScheduler封裝為可以執行的TaskSetManager對象
- TaskSetManager對象與Driver中的Executor資源進行匹配,在隊形的Executor中發布任務(發送LaunchTask指令)
- TaskRunner執行完畢后,調用DriverRunner提交給DAGScheduler,循環7.直到任務完成
我們將在如下章節逐步介紹:
《【Spark2.0源碼學習】-7.Driver與DriverRunner》
《【Spark2.0源碼學習】-8.SparkContext與Application介紹》
《【Spark2.0源碼學習】-9.Job提交與Task的拆分》
《【Spark2.0源碼學習】-10.Task執行與回饋》
說明:由於Spark屬於一個比較大的工程,時間有限,很多非關鍵點會選擇點到即止,另外存在理解錯誤望理解與指正!
