Spark架構與工作機制
Spark架構與工作機制
Spark的架構 — 架構元件概念簡介
Spark叢集中Master負責叢集整體資源管理和排程,Worker負責單個節點的資源管理。Driver程式是應用邏輯執行的起點,而多個Executor用來對資料進行並行處理。
Spark的構成:
- ClusterManager : 在standalone模式中即為,Master :主節點,控制整個叢集,監控Worker。在YARN模式中為資源管理器。
- Worker : 從節點,負責控制計算節點,啟動Executor或Driver。在YARN模式中為NodeManager,負責計算節點的控制。
- Driver : 執行Application的main()函式並且建立SparkContext。
- Executor: 執行器,是為某Application執行在worker node上的一個程序,啟動執行緒池執行任務上。每個Application擁有獨立的一組executors。
- SparkContext : 整個應用的上下文,控制應用的生命週期。
- RDD:Spark的基本計算單元,一組RDD形成執行的有向無環圖RDD Graph。
- DAG Scheduler:根據Job構建基於Stage的DAG,並提交Stage給TaskScheduler。
- TaskScheduler:將Task分發給Executor執行。
- SparkEnv : 執行緒級別的上下文,儲存執行時的重要元件的引用。
Spark的架構 — 架構圖
Spark的架構 — 叢集執行機制
Client 提交應用,Master找到一個Worker啟動Driver,Driver向Master或者資源管理器申請資源,之後將應用轉化為RDD Graph,再由DAGScheduler將RDD Graph轉化為Stage的有向無環圖提交給TaskScheduler,由TaskScheduler提交任務給Executor進行執行。任務執行的過程中其他元件再協同工作確保整個應用順利執行。
Spark的工作機制
Spark作業:
- Application: 使用者自定義的Spark程式,使用者提交後,Spark為App分配資源將程式轉換並執行。
- Driver Program :執行Application的main()函式並且建立SparkContext,。
- RDD Graph:RDD是Spark的核心結構,可以通過一系列運算元進行操作(主要有Transformation和Action操作)。當RDD遇到Action運算元,將之前的所有運算元形成一個有向無環圖(DAG),也就是圖中的RDD Graph。再在Spark中轉化為Job,提交到叢集進行執行。一個App中可以包含多Job。
- Job: 一個RDD Graph觸發的作業,往往由Spark Action運算元觸發,在SparkContext中通過runJob方法向Spark提交Job。
- Stage:每個Job會根據RDD的寬依賴關係被切分很多Stage,每個Stage中包含一組相同的Task,這一組Task也叫TaskSet。
- Task: 一個分割槽對應一個Task,Task執行RDD中對應Stage中所包含的運算元。Task被封裝好後放入Executor的執行緒池中執行。
Spark的工作機制 — 作業概念
Spark的工作機制 — 程式與作業概念對映
val rawFile = sc.textFile(“README.md”) // Application: 1–6 行
val words = rawFile.flatMap(line => line.split(“ ”)) // Job: 1-5 行
val wordNumber = words.map(w => (w, 1)) // Stage: 1–3 或 5-6 行
val wordCounts = wordNumber.reduceByKey(_ + _) // Tasks: 1-3 或 5–6行
wordCounts.foreach(println)
wordCounts.saveAsTextFile
Spark的工作機制 — 作業執行流程
Spark執行流程:
- Spark程式轉換
- 輸入資料塊
- 根據排程策略執行各個Stage的Tasks
- 輸出結果返回
Spark排程原理
Spark的排程原理 — 作業排程簡介
系統的設計很重要的一環便是資源排程。設計者將資源進行不同粒度的抽象建模,然後將資源統一放入排程器,通過一定的演算法進行排程,最終要達到高吞吐或者低訪問延遲的目的。
Spark有多種執行模式,例如Local模式、Standalone模式、YARN模式、Mesos模式。在叢集環境下,為了減少複雜性,抓住系統主要脈絡進行理解。本節主要對Standalone模式中的名詞進行介紹,其他執行模式中各角色實現的功能基本一致,只不過是在特定資源管理器下使用略為不同的名稱和排程機制。
Spark的排程原理 — 作業排程簡介
Spark的排程原理 — Application排程
Application排程就是組由使用者提交到Spark中的作業集合,通過一定的演算法,對每個按一定次序分配叢集中資源的過程。
- 例如:
FIFO模式,使用者先提交的作業1優先分配需要的資源,之後提交的作業2再分配資源,依次類推。
Application排程模式:
- Standalone :FIFO模式
- Mesos : 粗粒度模式和細粒度模式
- YARN : 獨佔模式
Spark的排程原理 — Job排程
Job排程就是在Application內部的一組Job集合,在Application分配到的資源量下,通過一定的演算法,對每個按一定次序分配Application中資源的過程。
- 例如:
FIFO模式,使用者先提交的Job1優先分配需要的資源,之後提交的Job2再分配資源,依次類推。
Job排程模式:
- FIFO模式
- FAIR模式
FIFO模式:
預設情況下,Spark的排程器以FIFO(先進先出)的方式排程Job的執行。每個Job被切分為多個stage。第一個Job優先獲取所有可用的資源,接下來第二個Job再進行剩餘資源獲取。這樣依次類推,如果第一個Job並沒有佔用滿所有的資源,則第二個Job還可以繼續獲取剩餘資源,這樣多個Job可以並行執行。
FAIR模式:
在FAIR共享模式排程下,Spark在多Job之間以輪詢(round robin)方式給任務進行資源分配,所有的任務擁有大致相當的優先順序來共享叢集的資源。這就意味著當一個長任務正在執行時,短任務仍可以被分配到資源,提交併執行,並且獲得不錯的響應時間。這樣就不用像以前一樣需要等待長任務執行完才可以。這種排程模式很適合多使用者的場景。
資料本地性:
儘量的避免資料在網路上的傳輸。
Tasks延時排程機制:
擁有資料的節點當前正被其他的task佔用,如果預測當前節點結束當前任務的時間要比移動資料的時間還要少,那麼排程會等待,直到當前節點可用。否則移動資料到資源充足節點,分配任務執行。