文章目錄
- Spark執行流程
Spark執行流程
- 提交應用程式Application(包括Driver代碼和Executor代碼)
- 啟動Driver,創建SparkContext物件,并加載配置資訊、依賴資訊和代碼
- DAG graph:根據用戶提交的計算邏輯(Application)中的RDD的轉換和動作來生成RDD之間的依賴關系,同時這個計算鏈也就生成了邏輯上的DAG(有向無環圖),
- DAGScheduler:基于stage的調度器,負責創建Job,將DAG中的RDD劃分到不同的Stage,并將Stage作為TaskSet提交給底層調度器TaskScheduler執行,
- TaskScheduler:任務調度器,Spark通過它提交任務并且請求集群調度任務,因其調度的 Task 由 DAGScheduler 創建,所以DAGScheduler是TaskScheduler的前置調度,
- SparkContext可以連接不同型別的Cluster Manager(Standalone,YARN,Mesos)
并根據DAGSchduler向Cluster Manager申請資源(需要多少個Executor) - 一個Worker節點默認一個Executor,如果集群并發度較高(需要運行很多個Application)
則需要開啟單節點多Executor模式,通過SPARK_WORKER_INSTANCES調整 - Cluster Manager將Executor的節點資訊反饋給SparkContext
- SparkContext通過SchedulerBackend給任務分配Executor資源
再通過TaskScheduler把任務調度到對應的Worker節點上的Executor - Executor有一個執行緒池,每個執行緒(core)可以執行一個task
- 當Executor收到一個TaskSet之后,會啟動多個執行緒對這一批task并行計算
- 每一個task處理一個RDD磁區,因此每一次并行計算會生成新的RDD磁區(即map,flatMap,reduce等轉換算子操作)
- 然后Driver會根據新的RDD向Executor提交新的task,直至stage結束(遇到shuffle)
- 因為stage是以shuffle(寬依賴)來劃分的,因此這個程序不存在跨磁區(窄依賴有利于高并發),
- 當Executor上的task全部執行完成后,如果需要進行shuffle(發生寬依賴)才能進入下一步計算
則會根據DAG找到相應的Worker節點,將生成的RDD資料集遷移到當前Executor上進行計算 - 以Action算子為Job結束的標志,將結果資料落盤或輸出控制臺,
通過DAG判斷所有Job是否執行完畢,是的話則將結果帶回SparkContext,并反饋Cluster Manager,釋放SparkContext資源, - Executor可以為應用程式中要求快取的RDD提供記憶體式存盤,RDD是直接快取在Executor行程內的,
如果某個Job程序中產生的RDD資料集要跟其他的Job共用,那么在這個Job計算的程序可以呼叫cache或persist方法把資料快取,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/245636.html
標籤:其他
上一篇:Apache Flink漏洞(CVE-2020-17519)復現
下一篇:Apache 配置與應用
