1、Spark on Standalonenode
1.spark集羣啓動後,Worker向Master註冊信息數據庫
2.spark-submit命令提交程序後,driver和application也會向Master註冊信息app
3.建立SparkContext對象:主要的對象包含DAGScheduler和TaskScheduler框架
4.Driver把Application信息註冊給Master後,Master會根據App信息去Worker節點啓動Executorspa
5.Executor內部會建立運行task的線程池,而後把啓動的Executor反向註冊給Dirver線程
6.DAGScheduler:負責把Spark做業轉換成Stage的DAG(Directed Acyclic Graph有向無環圖),根據寬窄依賴切分Stage,而後把Stage封裝成TaskSet的形式發送個TaskScheduler;對象
同時DAGScheduler還會處理因爲Shuffle數據丟失致使的失敗;隊列
7.TaskScheduler:維護全部TaskSet,分發Task給各個節點的Executor(根據數據本地化策略分發Task),監控task的運行狀態,負責重試失敗的task;進程
8.全部task運行完成後,SparkContext向Master註銷,釋放資源;內存
注:job的失敗不會重試
2、Spark on Yarn
yarn是一種統一的資源管理機制,能夠經過隊列的方式,管理運行多套計算框架。Spark on Yarn模式根據Dirver在集羣中的位置分爲兩種模式
一種是Yarn-Client模式,另外一種是Yarn-Cluster模式
yarn框架的基本運行流程圖
ResourceManager:負責將集羣的資源分配給各個應用使用,而資源分配和調度的基本單位是Container,其中封裝了集羣資源(CPU、內存、磁盤等),每一個任務只能在Container中運行,而且只使用Container中的資源;
NodeManager:是一個個計算節點,負責啓動Application所需的Container,並監控資源的使用狀況彙報給ResourceManager
ApplicationMaster:主要負責向ResourceManager申請Application的資源,獲取Container並跟蹤這些Container的運行狀態和執行進度,執行完後通知ResourceManager註銷ApplicationMaster,ApplicationMaster也是運行在Container中;
(1)client
yarn-client模式,Dirver運行在本地的客戶端上。
1.client向ResouceManager申請啓動ApplicationMaster,同時在SparkContext初始化中建立DAGScheduler和TaskScheduler
2.ResouceManager收到請求後,在一臺NodeManager中啓動第一個Container運行ApplicationMaster
3.Dirver中的SparkContext初始化完成後與ApplicationMaster創建通信,ApplicationMaster向ResourceManager申請Application的資源
4.一旦ApplicationMaster申請到資源,便與之對應的NodeManager通信,啓動Executor,並把Executor信息反向註冊給Dirver
5.Dirver分發task,並監控Executor的運行狀態,負責重試失敗的task
6.運行完成後,Client的SparkContext向ResourceManager申請註銷並關閉本身
(2)cluster
yarn-cluster模式中,當用戶向yarn提交應用程序後,yarn將分爲兩階段運行該應用程序:
第一個階段是把Spark的Dirver做爲一個ApplicationMaster在yarn中啓動;
第二個階段是ApplicationMaster向ResourceManager申請資源,並啓動Executor來運行task,同時監控task整個運行流程並重試失敗的task;
Yarn-client和Yarn-cluster的區別:
yarn-cluster模式下,Dirver運行在ApplicationMaster中,負責申請資源並監控task運行狀態和重試失敗的task,當用戶提交了做業以後就能夠關掉client,做業會繼續在yarn中運行;
yarn-client模式下,Dirver運行在本地客戶端,client不能離開。
Dirver與集羣間的通訊主要有如下幾點:
1.註冊Dirver信息
2.根據寬窄依賴切分stage
3.註冊Application信息
4.分發task
5.監聽task的運行狀態
6.重試失敗的task
7.重試失敗的stage
Spark的數據本地化機制有如下5種:
一、PROCESS_LOCAL 進程本地化
二、NODE_LOCAL 節點本地化
三、NO_PREF 讀取的數據在數據庫中
四、RACK_LOCAL 機架本地化
五、ANY 跨機架
如何選擇數據本地化的級別?
TaskScheduler發送的task在Executor上沒法執行時,TaskScheduler會下降數據本地化的級別,再次發送,若是仍是沒法執行,再下降一次數據本地化的級別,再次發送,直至能夠執行。
默認每次等待3s,重試5次,以後降一級本地化級別。
如何提升數據本地化的級別?
task執行的等待時間延長,從原來的3s提升到6s
提升數據本地化的級別要注意,不要本末倒置
spark.locality.wait 默認3s
spark.locality.process 等待進程本地化的時間,默認與spark.locality.wait相等
spark.locality.node
spark.locality.rack
Spark shuffle階段的數據傳輸
MapOutputTrackerWorker(從):在spark集羣的每一個worker中,負責將本地的map output block信息發送給master中的MapOutputTrackerMaster
MapOutputTrackerMaster(主):在spark集羣的master中,負責記錄各個worker節點的map output block信息
BlockManager:每一個Executor中的BlockManager實例化的時候都會向Dirver中的BlockManagerMaster註冊信息,而BlockManagerMaster會建立BlockManagerInfo來管理元數據信息
BlockManagerMaster:在DAGScheduler對象中,管理元數據信息
BlockManagerSlaveEndpoint:在Executor端,負責接收BlockManagerMaster發送過來的信息
BlockTransferService:傳輸各個節點的block
MemoryStore、DiskStore