圖檔
- 一. 概念
- 二. 作業排程流程
- 三. Spark運作架構具有以下特點
- 四. spark 詳細運作過程
-
-
- 1)
- 2)
- 3)
-
一. 概念
一個Application由一個Driver和若幹個Job構成,
一個Job由多個Stage構成,
一個Stage由多個沒有Shuffle關系的Task組成(多個RDD算子操作)
stage:寬窄依賴劃分
當執行一個Application時,Driver會向叢集管理器申請資源,啟動Executor,并向Executor發送應用程式代碼和檔案,然後在Executor上執行Task,運作結束後,執行結果會傳回給Driver,或者寫到HDFS或者其他資料庫中.
二. 作業排程流程
- 建構Spark Application的運作環境(啟動SparkContext),SparkContext向資料總管(可以是Standalone、Mesos或YARN)注冊并申請運作Executor資源;
- 資料總管配置設定Executor資源并啟動StandaloneExecutorBackend,Executor運作情況将随着心跳發送到資料總管上;
- SparkContext建構成DAG圖,将DAG圖分解成Stage,并把Taskset發送給Task Scheduler。Executor向SparkContext申請Task
- Task Scheduler将Task發放給Executor運作同時SparkContext将應用程式代碼發放給Executor。
- Task在Executor上運作,運作完畢釋放所有資源。
三. Spark運作架構具有以下特點
(1)每個Application擷取專屬的executor程序,該程序在Application期間一直駐留,并以多線程方式運作tasks。這種Application隔離機制有其優勢的,無論是從排程角度看(每個Driver排程它自己的任務),還是從運作角度看(來自不同Application的Task運作在不同的JVM中)。當然,這也意味着Spark Application不能跨應用程式共享資料,除非将資料寫入到外部存儲系統。
(2)Spark與資料總管無關,隻要能夠擷取executor程序,并能保持互相通信就可以了。
(3)送出SparkContext的Client應該靠近Worker節點(運作Executor的節點),最好是在同一個Rack裡,因為Spark Application運作過程中SparkContext和Executor之間有大量的資訊交換;如果想在遠端叢集中運作,最好使用RPC将SparkContext送出給叢集,不要遠離Worker運作SparkContext。
(4)Task采用了資料本地性和推測執行的優化機制。
四. spark 詳細運作過程
1)
- Driver程式的代碼運作到action操作,觸發了SparkContext的runJob方法。
- SparkContext調用DAGScheduler的runJob函數。
- DAGScheduler把Job劃分stage,然後把stage轉化為相應的Tasks,把Tasks交給TaskScheduler。
- 通過TaskScheduler把Tasks添加到任務隊列當中,交給SchedulerBackend進行資源配置設定和任務排程, 每個tasks就有多個Threads, 在worker中process(運作)。
- 排程器給Task配置設定執行Executor,ExecutorBackend負責執行Task。Executor執行結束後,回傳給Driver,把執行結果存儲到本地或hdfs上
2)
- Driver程式的代碼運作到action操作,觸發了SparkContext的runJob方法。
- SparkContext調用DAGScheduler的runJob函數。
- DAGScheduler把Job劃分stage,然後 DAGScheduler把Job送出stage,DAGScheduler把stage轉化為相應的TaskSet,把TaskSet交給TaskScheduler。
- 通過TaskScheduler把Tasks添加到任務隊列當中,并把計算任務送出給排程器SchedulableBuilder
- 排程器SchedulableBuilder排程任務TaskScheduler
- TaskScheduler為task配置設定任務資源,并送出tasks給SchedulerBackend
- 交給SchedulerBackend進行資源配置設定和任務排程, 将任務送出到Executor上運作, 在Executor(worker)中process(運作)。
- 排程器給Task配置設定執行Executor,ExecutorBackend負責執行Task。Executor執行結束後,回傳給Driver,把執行結果存儲到本地或hdfs上
3)
-
我們送出一個任務,任務就叫Application
初始化程式的入口SparkContext,
1.1 初始化DAG Scheduler
1.2 初始化Task Scheduler
- Task Scheduler中的ClientEndpoint向master去進行注冊并申請資源(CPU Core和Memory)
- Master根據SparkContext的資源申請要求和Worker心跳周期内報告的資訊決定在哪個Worker上配置設定資源,然後在該Worker上擷取資源,然後啟動StandaloneExecutorBackend;順便初始化好了一個線程池,通知worker啟動Executor
-
StandaloneExecutorBackend向Driver(SparkContext)注冊,這樣Driver就知道哪些Executor為他進行服務了。
到這個時候其實我們的初始化過程基本完成了,我們開始執行transformation的代碼,但是代碼并不會真正的運作,直到我們遇到一個action操作。生産一個job任務,進行stage的劃分
-
發送任務到Executor進行執行
5.1 SparkContext将Applicaiton代碼發送給Standalone ExecutorBackend;并且SparkContext解析Applicaiton代碼,建構DAG圖,并送出給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在擷取外部資料和shuffle之前産生)。
5.2 将Stage(或者稱為TaskSet)送出給Task Scheduler。Task Scheduler負責将Task配置設定到相應的Worker,最後送出給StandaloneExecutorBackend執行;
5.3 對task進行序列化,并根據task的配置設定算法,配置設定task
5.4 對接收過來的task進行反序列化,把task封裝成一個線程
- 開始執行Task,并向SparkContext報告,回報任務狀态給Driver
- APPlication程式運作完畢後,回收資源