轉載請註明出處:http://www.cnblogs.com/BYRans/
shell
Spark應用程序相關的幾個術語:安全
Spark應用程序有多種運行模式。SparkContext和Executor這兩部分的核心代碼實如今各類運行模式中都是公用的,在這兩部分之上,根據運行部署模式(例如:Local[N]、Yarn cluster等)的不一樣,有不一樣的調度模塊以及對應的適配代碼。架構
具體來講,以SparkContext爲程序運行的總入口,在SparkContext的初始化過程當中,Spark會分別建立DAGScheduler做業和TaskScheduler任務調度兩級調度模塊。併發
其中做業調度模塊是基於任務階段的高層調度模塊,它爲每一個Spark做業計算具備依賴關係的多個調度階段(一般根據shuffle來劃分),而後爲每一個階段構建出一組具體的任務(一般會考慮數據的本地性等),而後以TaskSets(任務組)的形式提交給任務調度模塊來具體執行。而任務調度模塊則負責具體啓動任務、監控和彙報任務運行狀況。框架
詳細的運行流程爲:異步
做業調度模塊和具體的部署運行模式無關,在各類運行模式下邏輯相同。不一樣運行模式的區別主要體如今任務調度模塊。不一樣的部署和運行模式,根據底層資源調度方式的不一樣,各自實現了本身特定的任務調度模塊,用來將任務實際調度給對應的計算資源。接下來重點介紹下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-client
。oop
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主要負責以下功能:
Spark的各類運行模式雖然在啓動方式、運行爲之、調度手段上有所不一樣,但它們所要完成的任務基本是一致的,就是在合適的位置安全可靠的根據用戶的配置和做業的須要管理和運行任務,在運行調度過程當中須要考慮的問題主要爲:
Spark的運行參數有很大一部分是經過環境變量來設置的,例如Executor的內存設置、Library路徑等。在Cluster模式下就涉及到環境變量在各個Worker節點的傳遞問題。不一樣的運行模式有不一樣的傳遞方式。須要指出的是,在Local模式下,不存在環境變量的傳遞問題。
在這裏主要說明一下再YARN相關模式下的參數傳遞。在YARN相關模式中,這些環境變量首先要經過YARN client設置到Spark AM的運行環境中,以後Spark AM在啓動Executor時再將環境變量設置到Executor中。
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等。