《大數據計算引擎之Spark》一、基本原理

 

前兩篇我們講了spark的基礎知識,包括spark的體系結構、執行框架、spark的基本數據類型以及spark中stage的劃分等等。本篇要介紹spark運行的原理。包括spark的內部執行機制,spark的基本數據類型RDD的執行流程。

1. Spark內部執行機制

1.1 內部執行流程

spark的內部執行機制在《spark基礎•下篇》已有介紹,此處再簡單介紹下。
  如下圖1爲分佈式集羣上spark應用程序的一般執行框架。主要由sparkcontext(spark上下文)、cluster manager(資源管理器)和▪executor(單個節點的執行進程)。其中cluster manager負責整個集羣的統一資源管理。executor是應用執行的主要進程,內部含有多個task線程以及內存空間。

圖1 spark分佈式部署圖


  詳細流程圖如下圖2:

圖2 詳細流程圖

 

  • (1) 應用程序在使用spark-submit提交後,根據提交時的參數設置(deploy mode)在相應位置初始化sparkcontext,即spark的運行環境,並創建DAG Scheduler和Task Scheduer,Driver根據應用程序執行代碼,將整個程序根據action算子劃分成多個job,每個job內部構建DAG圖,DAG Scheduler將DAG圖劃分爲多個stage,同時每個stage內部劃分爲多個task,DAG Scheduler將taskset傳給Task Scheduer,Task Scheduer負責集羣上task的調度。至於stage和task的關係以及是如何劃分的我們後面再詳細講。
  • (2) Driver根據sparkcontext中的資源需求向resource manager申請資源,包括executor數及內存資源。
  • (3) 資源管理器收到請求後在滿足條件的work node節點上創建executor進程。
  • (4) Executor創建完成後會向driver反向註冊,以便driver可以分配task給他執行。
  • (5) 當程序執行完後,driver向resource manager註銷所申請的資源。

1.2 job、stage、task的關係

Job、stage和task是spark任務執行流程中的三個基本單位。其中job是最大的單位,Job是spark應用的action算子催生的;stage是由job拆分,在單個job內是根據shuffle算子來拆分stage的,單個stage內部可根據操作數據的分區數劃分成多個task。如下圖3所示

 

圖3 job、stage和task的關係圖

2. RDD 的執行流程

上一節我們介紹了spark應用程序的大概執行流程,由於spark應用程序中的數據塊基本都是RDD,本節我們來看下應用程序中RDD的執行流程。

2.1 RDD 從創建到執行

RDD從創建到執行的流程如下圖4所示

 

圖4 RDD執行流程

  • (1) 首先針對一段應用代碼,driver會以action算子爲邊界生成響應的DAG圖
  • (2) DAG Scheduler從DAG圖的末端開始,以圖中的shuffle算子爲邊界來劃分stage,stage劃分完成後,將每個stage劃分爲多個task,DAG Scheduler將taskSet傳給Task Scheduler來調用
  • (3) Task Scheduler根據一定的調度算法,將接收到的task池中的task分給work node節點中的executor執行
    這裏我們看到RDD的執行流程中,DAG Scheduler和Task Scheduler起到非常關鍵的作用個,因此下面我們來看下DAG Scheduer和Task Scheduler的工作流程。

2.2 DAG Scheduler工作流程

DAG Scheduler是一個高級的scheduler 層,他實現了基於stage的調度,他爲每一個job劃分stage,並將單個stage分成多個task,然後他會將stage作爲taskSet提交給底層的Task Scheduler,由Task Scheduler執行。
DAG的工作原理如下圖5:

 

圖5 DAG Scheduler工作流程

  針對左邊的一段代碼,DAG Scheduler根據collect(action算子)將其劃分到一個job中,在此job內部,劃分stage,如上右圖所示。DAG Scheduler在DAG圖中從末端開始查找shuffle算子,上圖中將reduceByKey爲stage的分界,shuffle算子只有一個,因此分成兩個stage。前一個stage中,RDD在map完成以後執行shuffle write將結果寫到內存或磁盤上,後一個stage首先執行shuffle read讀取數據在執行reduceByKey,即shuffle操作。

2.3 TASK Scheduler工作流程

Task Scheduler是sparkContext中除了DAG Scheduler的另一個非常重要的調度器,task Scheduler負責將DAGS cheduer產生的task調度到executor中執行。如下圖6所示,Task Scheduler 負責將TaskSetPool中的task調度到executor中執行,一般的調度模式是FIFO(先進先出),也可以按照FAIR(公平調度)的調度模式,具體根據配置而定。其中FIFO:顧名思義是先進先出隊列的調度模式,而FAIR則是根據權重來判斷,權重可以根據資源的佔用率來分,如可設佔用較少資源的task的權重較高。這樣就可以在資源較少時,調用後來的權重較高的task先執行了。至於每個executor中同時執行的task數則是由分配給每個executor中cpu的核數決定的。

 

圖6 TaskScheduler的工作流程



作者:ZPPenny
鏈接:https://www.jianshu.com/p/cedbebfeea8c
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章