Spark 基礎 - Spark 作業提交#
內容整理自:
Spark 提交作業流程#
名詞概念#
-
Application
: 用戶編寫的 Spark 應用程序,包含了一個 Driver 功能的代碼和分布在集群中多個節點上運行的 Executor 代碼 -
Driver
: Driver 即運行上述 Application 的 main () 函數並且創建 SparkContext 準備 Spark 應用程序的運行環境。在 Spark 中由 SparkContext 負責和 ClusterManager 通信,進行資源的申請、任務的分配和監控等;當 Executor 部分運行完畢後,Driver 負責將 SparkContext 關閉。通常用 SparkContext 代表 Driver -
Worker
:集群中任何可以運行 Application 代碼的節點,類似於 YARN 中的 NodeManager 節點。在 Standalone 模式中指的就是通過 Slave 文件配置的 Worker 節點,在 Spark on Yarn 模式中指的就是 NodeManager 節點 -
Executor
: Application 運行在 Worker 節點上的一個進程,該進程負責運行 Task,並且負責將數據存在內存或者磁碟上,每個 Application 都有各自獨立的一批 Executor -
Cluster Manager
:指的是在集群上獲取資源的外部服務,目前有:- Standalone:Spark 原生的資源管理,由 Master 負責資源的分配
- Hadoop Yarn:由 YARN 中的 ResourceManager 負責資源的分配
執行流程#
兩個核心:DAGScheduler
和TaskScheduler
詳情見: Spark 進階 - Spark 調度系統
Spark 三種作業提交模式#
local 模式#
- local 模式下,沒有所謂的
master+worker
這種概念 - local 模式,相當於,啟動一個本地進程,然後在一個進程內,模擬 spark 集群中作業的運行一個 spark 作業,就對應了進程中的一個或多個 executor 線程,就開始執行,包括作業的調度,task 分配
Standalone 提交模式#
standalone 模式提交,需要將 master 設置成 spark://master_ip,比如 spark://192.168.75.101:7077
Standalone Client 模式#
流程描述
-
客戶端啟動後直接運行用戶程序,啟動 Driver 相關的工作:DAGScheduler 和 BlockManagerMaster 等。
-
客戶端的 Driver 向 Master 註冊。
-
Master 還會讓 Worker 啟動 Executor。Worker 創建一個 ExecutorRunner 線程,ExecutorRunner 會啟動 ExecutorBackend 進程。
-
ExecutorBackend 啟動後會向 Driver 的 SchedulerBackend 註冊。Driver 的 DAGScheduler 解析作業並生成相應的 Stage,每個 Stage 包含的 Task 通過 TaskScheduler 分配給 Executor 執行。
-
所有 stage 都完成後作業結束
Standalone Cluster 模式#
-
客戶端提交作業給 master
-
Master 選擇一個 Worker 節點啟動 Driver,即
SchedulerBackend
。Worker 創建一個 DriverRunner 線程,DriverRunner 啟動 SchedulerBackend 進程 -
Master 讓其餘 Worker 啟動 Executor,即
ExecutorBackend
。Worker 創建一個 ExecutorRunner 線程,ExecutorRunner 會啟動 ExecutorBackend 進程 -
ExecutorBackend 啟動後會向 Driver 的 SchedulerBackend 註冊。SchedulerBackend 進程中包含 DAGScheduler,它會根據用戶程序,生成執行計劃,並調度執行。對於每個 stage 的 task,會被存放到 TaskScheduler 中,ExecutorBackend 向 SchedulerBackend 匯報的時候把 TaskScheduler 中的 task 調度到 ExecutorBackend 執行
Standalone Client 和 Standalone Cluster 區別#
- client mode 下,在哪台機器上用 spark-submit 腳本提交 application,driver 就會在那台機器上啟動
- cluster mode 下,driver 會通過 master 進程,隨機被分配給某一個 worker 進程來啟動
Yarn 提交模式#
Yarn-Client 模式#
-
Spark Yarn Client 向 YARN 的
ResourceManager
申請啟動Application Master
-
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 的 SparkContext 向 ResourceManager 申請註銷並關閉自己
YARN-Cluster 模式#
在 YARN-Cluster 模式中,當用戶向 YARN 中提交一個應用程序後,YARN 將分兩個階段運行該應用程序:
- 第一个階段是把 Spark 的 Driver 作為一個 ApplicationMaster 在 YARN 集群中先啟動;
- 第二個階段是由 ApplicationMaster 創建應用程序,然後為它向 ResourceManager 申請資源,並啟動 Executor 來運行 Task,同時監控它的整個運行過程,直到運行完成
YARN-Client 與 YARN-Cluster 區別#
-
YARN-Cluster
模式下,Driver 運行在 AM (Application Master) 中,它負責向 YARN 申請資源,並監督作業的運行狀況。當用戶提交了作業之後,就可以關掉 Client,作業會繼續在 YARN 上運行,因此 YARN-Cluster 模式不適合運行交互類型的作業 -
YARN-Client
模式下,Application Master 僅僅向 YARN 請求 Executor,Client 會和請求的 Container 通信來調度它們的工作,也就是說 Client 不能離開。Driver 運行在提交 spark 作業的客戶端機器上,可以實時看到詳細的日誌信息,方便追蹤和排查錯誤,用於測試