Spark集羣的運行流程

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數據丟失致使的失敗;blog

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

相關文章
相關標籤/搜索