Spark開發-執行架構基本概念

Xlucas發表於2017-10-13

1:基本術語
Application: 基於Spark的使用者程式,包含了一個driver program 和 叢集中多個的executor
Driver Program :執行Application的main()函式並且建立SparkContext,通常用SparkContext代表Driver Program
Executor: 是為某Application執行在worker node上的一個程式,該程式負責執行Task,並且負責將資料存在記憶體或者磁碟上。每個Application都有各自獨立的executors。
Cluster Manager: 在叢集上獲取資源的外部服務(例如:Standalone、Mesos、Yarn)
Worker Node: 叢集中任何可以執行Application程式碼的節點
Task: 被送到某個executor上的工作單元
Job: 包含多個Task組成的平行計算,往往由Spark action催生,該術語可以經常在日誌中看到。
Stage: 每個Job會被拆分很多組task,每組任務被稱為Stage,也可稱TaskSet,該術語可以經常在日誌中看到。
RDD:Spark的基本計算單元,可以通過一系列運算元進行操作(主要有Transformation和Action操作),詳情見RDD 細解、Spark1.0.0 程式設計模型。
DAG Scheduler:根據Job構建基於Stage的DAG,並提交Stage給TaskScheduler,詳見DAG Scheduler 細解。
TaskScheduler:將Taskset提交給worker(叢集)執行並回報結果,詳見TaskScheduler 細解。
關於Application中的幾個概念可如下圖所示:
這裡寫圖片描述

2:Spark執行架構
Spark執行架構參見下面示意圖:
構建Spark Application的執行環境(啟動SparkContext)
SparkContext向資源管理器(可以是Standalone、Mesos、Yarn)申請執行Executor資源,並啟動StandaloneExecutorBackend,executor向SparkContext申請Task。
SparkContext將應用程式程式碼發放給executor
SparkContext構建成DAG圖、將DAG圖分解成Stage、將Taskset傳送給Task Scheduler、最後由Task Scheduler將Task發放給Executor執行。
Task在Executor上執行,執行完畢釋放所有資源。
這裡寫圖片描述
下面簡單的描述一下Spark on Standalone和Spark on YARN的執行過程,以後的篇幅中再具體描述。

3:Spark on Standalone執行過程(client模式)
SparkContext連線到Master,向Master註冊並申請資源(CPU Core 和Memory)
Master根據SparkContext的資源申請要求和worker心跳週期內報告的資訊決定在哪個worker上分配資源,然後在該worker上獲取資源,然後啟動StandaloneExecutorBackend。
StandaloneExecutorBackend向SparkContext註冊
SparkContext將Applicaiton程式碼傳送給StandaloneExecutorBackend;並且SparkContext解析Applicaiton程式碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在獲取外部資料和shu f f le之前產生),然後以Stage(或者稱為TaskSet)提交給Task Scheduler,Task Scheduler負責將Task分配到相應的worker,最後提交給StandaloneExecutorBackend執行;
StandaloneExecutorBackend會建立executor 執行緒池,開始執行Task,並向SparkContext報告,直至Task完成。
所有Task完成後,SparkContext向Master登出,釋放資源。
關於Spark on Standalone的更詳細資訊參見Spark1.0.0 on Standalone 執行架構例項解析
這裡寫圖片描述
4:Spark on YARN 執行過程(cluster模式)
使用者通過bin/spark-submit( Spark1.0.0 應用程式部署工具spark-submit)或 bin/spark-class 向YARN提交Application
RM為Application分配第一個container,並在指定節點的container上啟動SparkContext。
SparkContext向RM申請資源以執行Executor
RM分配Container給SparkContext,SparkContext和相關的NM通訊,在獲得的Container上啟動StandaloneExecutorBackend,StandaloneExecutorBackend啟動後,開始向SparkContext註冊並申請Task
SparkContext分配Task給StandaloneExecutorBackend執行
StandaloneExecutorBackend執行Task並向SparkContext彙報執行狀況
Task執行完畢,SparkContext歸還資源給NM,並登出退出。
關於Spark on Standalone的更詳細資訊參見Spark1.0.0 on YARN 執行架構例項解析

這裡寫圖片描述
5:Spark執行架構的特點
每個Application獲取專屬的executor程式,該程式在Application期間一直駐留,並以多執行緒方式執行tasks。這種Application隔離機制有其優勢的,無論是從排程角度看(每個Driver排程它自己的任務),還是從執行角度看(來自不同Application的Task執行在不同的JVM中)。當然,這也意味著Spark Application不能跨應用程式共享資料,除非將資料寫入到外部儲存系統。
Spark與資源管理器無關,只要能夠獲取executor程式,並能保持相互通訊就可以了。
提交SparkContext的Client應該靠近Worker節點(執行Executor的節點),最好是在同一個Rack裡,因為Spark Application執行過程中SparkContext和Executor之間有大量的資訊交換;如果想在遠端叢集中執行,最好使用RPC將SparkContext提交給叢集,不要遠離Worker執行SparkContext。
Task採用了資料本地性和推測執行的優化機制

轉:http://blog.csdn.net/book_mmicky/article/details/25714419

相關文章