1. 程式人生 > >Spark架構與工作機制

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佔用,如果預測當前節點結束當前任務的時間要比移動資料的時間還要少,那麼排程會等待,直到當前節點可用。否則移動資料到資源充足節點,分配任務執行。