Spark開發-執行架構基本概念
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採用了資料本地性和推測執行的優化機制
相關文章
- Spark資料收藏--------Spark執行架構Spark架構
- spark基礎之spark sql執行原理和架構SparkSQL架構
- Spark開發-spark執行原理和RDDSpark
- Spark開發-Spark執行模式及原理一Spark模式
- 一行Spark程式碼的誕生記(深度剖析Spark架構)Spark架構
- 數字貨幣量化交易系統開發搭建執行架構指南架構
- Storm架構與執行原理ORM架構
- 執行緒基本概念執行緒
- 本地開發spark程式碼上傳spark叢集服務並執行(基於spark官網文件)Spark
- 【Spark】 Spark作業執行原理--獲取執行結果Spark
- MySQL基礎架構執行流程MySql架構
- 多執行緒基本概念執行緒
- 執行緒的基本概念執行緒
- Spark Task 的執行流程② - 建立、分發 TaskSpark
- OpenStack的基本概念與架構圖架構
- Spark的執行原理Spark
- spark執行原理、模型Spark模型
- 大資料架構之:Spark大資料架構Spark
- 【架構】Java併發程式設計——執行緒池的使用架構Java程式設計執行緒
- Biztalk 開發之架構架構
- 微信小程式的執行緒架構微信小程式執行緒架構
- .NET應用架構設計—服務端開發多執行緒使用小結(多執行緒使用常識)應用架構服務端執行緒
- Servlet基本概念及執行流程Servlet
- 執行緒池的基本概念執行緒
- 多執行緒詳解(1)——執行緒基本概念執行緒
- [大資料] Spark架構詳解大資料Spark架構
- 帶有Apache Spark的Lambda架構ApacheSpark架構
- Spark原理-物理執行圖Spark
- spark學習筆記--叢集執行SparkSpark筆記
- Spark學習(一)——執行模式與執行流程Spark模式
- 深入Netty邏輯架構,從Reactor執行緒模型開始Netty架構React執行緒模型
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- 招聘golang開發&架構師Golang架構
- Golang IM架構聊天開發Golang架構
- iOS開發-MVP架構模式iOSMVP架構模式
- Spark開發-Spark核心細說Spark
- Spark開發-spark環境搭建Spark
- Flink 的執行架構詳細剖析架構