Spark基本工做流程及YARN cluster模式原理(讀書筆記)

Spark基本工做流程及YARN cluster模式原理


轉載請註明出處:http://www.cnblogs.com/BYRans/

shell

Spark基本工做流程

相關術語解釋

Spark應用程序相關的幾個術語:安全

  • Worker:集羣中任何能夠運行Application代碼的節點,相似於YARN中的NodeManager節點。在Spark on Yarn模式中指的就是NodeManager節點;
  • Executor:Application運行在Worker 節點上的一個進程,該進程負責運行Task,而且負責將數據存在內存或者磁盤上,每一個Application都有各自獨立的一批Executor。
  • SparkContext:由用戶程序啓動,經過資源調度模塊與Executor通訊。
  • Driver:運行Application的main()函數,並建立SparkContext。其中建立SparkContext的目的是爲了準備Spark應用程序的運行環境。在Spark中由SparkContext負責和ClusterManager通訊,進行資源的申請、任務的分配和監控等;當Executor部分運行完畢後,Driver負責將SparkContext關閉。一般用SparkContext表明Drive;

基本運行流程

Spark應用程序有多種運行模式。SparkContext和Executor這兩部分的核心代碼實如今各類運行模式中都是公用的,在這兩部分之上,根據運行部署模式(例如:Local[N]、Yarn cluster等)的不一樣,有不一樣的調度模塊以及對應的適配代碼。架構

圖3-1 基本框架圖

具體來講,以SparkContext爲程序運行的總入口,在SparkContext的初始化過程當中,Spark會分別建立DAGScheduler做業和TaskScheduler任務調度兩級調度模塊。併發

其中做業調度模塊是基於任務階段的高層調度模塊,它爲每一個Spark做業計算具備依賴關係的多個調度階段(一般根據shuffle來劃分),而後爲每一個階段構建出一組具體的任務(一般會考慮數據的本地性等),而後以TaskSets(任務組)的形式提交給任務調度模塊來具體執行。而任務調度模塊則負責具體啓動任務、監控和彙報任務運行狀況。框架

詳細的運行流程爲:異步

  1. 構建Spark Application的運行環境(啓動SparkContext),SparkContext向資源管理器(能夠是Standalone、Mesos或YARN)註冊並申請運行Executor資源;
  2. 資源管理器分配Executor資源並啓動StandaloneExecutorBackend,Executor運行狀況將隨着心跳發送到資源管理器上;
  3. SparkContext構建成DAG圖,將DAG圖分解成Stage,並把Taskset發送給Task Scheduler。Executor向SparkContext申請Task,Task Scheduler將Task發放給Executor運行同時SparkContext將應用程序代碼發放給Executor。
  4. Task在Executor上運行,運行完畢釋放全部資源。

sparkProcessDetail

做業調度模塊和具體的部署運行模式無關,在各類運行模式下邏輯相同。不一樣運行模式的區別主要體如今任務調度模塊。不一樣的部署和運行模式,根據底層資源調度方式的不一樣,各自實現了本身特定的任務調度模塊,用來將任務實際調度給對應的計算資源。接下來重點介紹下YARN cluster模式的實現原理和實現細節。函數

YARN cluster運行模式的內部實現原理

Spark有多種運行模式,在這裏主要介紹下YARN cluster模式的內部實現原理。以下圖是YARN cluster模式的原理框圖,相對於其餘模式,該模式比較特殊的是它須要由外部程序輔助啓動APP。用戶的應用程序經過輔助的YARN Client類啓動。YARN cluster模式和YARN client模式的區別在於:YARN client模式的AM是運行在提交任務的節點,而YARN cluster模式的AM是由YARN在集羣中選取一個節點運行,不必定是在提交任務的節點運行。例如spark-shell若是須要使用YARN模式運行,只能爲yarn-client模式,啓動命令可使用spark-shell --master yarn-clientoop

圖3-9 YARN cluster模式邏輯架構框圖

Client類經過YARN Client API提交請求,在Hadoop集羣上啓動一個Spark ApplicationMaster,Spark ApplicationMaster首先註冊本身爲一個YARN ApplicationMaster,以後啓動用戶程序,SparkContext在用戶程序中初始化時,使用CoarseGrainedSchedulerBackend配合YARNClusterScheduler,YARNClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增長了對Executor的等待邏輯等。spa

根據Client類傳遞的參數,Spark ApplicationMaster經過YARN ResourceManager/NodeManager的接口在集羣中啓動若干個Container,用於運行CoarseGrainedExecutorBackend.CoarseGrainedExecutorBackend在啓動過程當中會向CoarseGrainedSchedulerBackend註冊。線程

CoarseGrainedSchedulerBackend是一個基於Akka Actor實現的粗粒度的資源調度類,在整個Spark做業運行期間,CoarseGrainedSchedulerBackend主要負責以下功能:

  • 監聽並持有註冊給它的Executor資源
  • 根據現有的Executor資源,進行Executor的註冊、狀態更新、相應Scheduler的請求等任務的調度

模式的實現細節

Spark的各類運行模式雖然在啓動方式、運行爲之、調度手段上有所不一樣,但它們所要完成的任務基本是一致的,就是在合適的位置安全可靠的根據用戶的配置和做業的須要管理和運行任務,在運行調度過程當中須要考慮的問題主要爲:

  • 環境變量的傳遞
  • JAR包和各類依賴文件的分發
  • 任務的管理和序列化等
  • 用戶參數配置
  • 用戶及權限控制

環境變量的傳遞

Spark的運行參數有很大一部分是經過環境變量來設置的,例如Executor的內存設置、Library路徑等。在Cluster模式下就涉及到環境變量在各個Worker節點的傳遞問題。不一樣的運行模式有不一樣的傳遞方式。須要指出的是,在Local模式下,不存在環境變量的傳遞問題。

在這裏主要說明一下再YARN相關模式下的參數傳遞。在YARN相關模式中,這些環境變量首先要經過YARN client設置到Spark AM的運行環境中,以後Spark AM在啓動Executor時再將環境變量設置到Executor中。

JAR包和依賴文件的分發

Spark程序的運行主要有兩類依賴:

  • Spark運行庫及其依賴
  • 應用程序自身的額外依賴

在Local模式下,不存在JAR包分發的問題。在這裏主要介紹下YARN模式下的文件分發。

在YARN相關模式中,運行庫和程序運行因此來的其餘文件首先經過HDFS客戶端API上傳到做業的.sparkStaing目錄下,而後將對應的文件和URL映射關係通知YARN,YARN的Node Manager在啓動Container的時候會從指定URL處下載相關文件做爲運行環境的一部分。

對於須要進一步分發到Executor運行環境的文件,Spark YARN客戶端將須要分發的文件的相關屬性(例:URL、時間戳、尺寸等)打包成字符串,經過特定的環境變量(SPARK_YARN_CACHE_XXXX)傳遞給Spark AM,Spark AM在建立Executor的Container時還原特定環境變中的各個文件,並經過調用setLocalResources函數初始化Container。

任務管理和序列化

Spark任務的運行要解決的問題爲:

  • 以正確的順序運行任務,有效地管理和分派任務
  • 將任務及運行所需相關數據有效地發送到遠端
  • 收集運行結果

Spark任務經過DAGScheduler調用TaskScheduler.submitTasks進行派發,該接口將相關的一組任務一塊兒提交併進行調度。

任務的運行結果在Executor端被序列化併發送回SchedulerBackend,因爲受到Akka幀尺寸的限制,若是運行結果數據過大,結果會存儲到BlockManager中,這時候發送到SchedulerBackend的是對應數據的BlockID,TaskScheduler最終會調用TaskResultGetter在線程池中以異步的方式讀取結果,TaskSetManager再根據運行結果更新任務狀態(好比失敗重試等)並彙報給DAGScheduler等。

相關文章
相關標籤/搜索