Spark集群的運行流程


一、Spark on Standalone

1.spark集群啟動后,Worker向Master注冊信息

2.spark-submit命令提交程序后,driver和application也會向Master注冊信息

3.創建SparkContext對象:主要的對象包含DAGScheduler和TaskScheduler

4.Driver把Application信息注冊給Master后,Master會根據App信息去Worker節點啟動Executor

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的失敗不會重試

二、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種:

1、PROCESS_LOCAL   進程本地化
2、NODE_LOCAL     節點本地化
3、NO_PREF            讀取的數據在數據庫中
4、RACK_LOCAL      機架本地化
5、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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM