Spark On Yarn的優點
每一個Spark executor做爲一個YARN容器(container)運行。Spark可使得多個Tasks在同一個容器(container)裏面運行
1. Spark支持資源動態共享,運行於Yarn的框架都共享一個集中配置好的資源池
2. 能夠很方便的利用Yarn的資源調度特性來作分類、隔離以及優先級控制負載,擁有更靈活的調度策略
3. Yarn能夠自由地選擇executor數量
4. Yarn是惟一支持Spark安全的集羣管理器,使用Yarn,Spark能夠運行於Kerberized Hadoop之上,在它們進程之間進行安全認證
咱們知道Spark on yarn有兩種模式:yarn-cluster和yarn-client。這兩種模式做業雖然都是在yarn上面運行,可是其中的運行方式很不同,今天就來談談Spark on YARN yarn-client模式做業從提交到運行的過程剖析html
相關概念
- Application: Appliction都是指用戶編寫的Spark應用程序,其中包括一個Driver功能的代碼和分佈在集羣中多個節點上運行的Executor代碼
- Driver: Spark中的Driver即運行上述Application的main函數並建立SparkContext,建立SparkContext的目的是爲了準備Spark應用程序的運行環境,在Spark中有SparkContext負責與ClusterManager通訊,進行資源申請、任務的分配和監控等,當Executor部分運行完畢後,Driver同時負責將SparkContext關閉,一般用SparkContext表明Driver
- Executor: 某個Application運行在worker節點上的一個進程, 該進程負責運行某些Task, 而且負責將數據存到內存或磁盤上,每一個Application都有各自獨立的一批Executor, 在Spark on Yarn模式下,其進程名稱爲CoarseGrainedExecutor Backend。一個CoarseGrainedExecutor Backend有且僅有一個Executor對象, 負責將Task包裝成taskRunner,並從線程池中抽取一個空閒線程運行Task, 這個每個oarseGrainedExecutor Backend能並行運行Task的數量取決與分配給它的cpu個數
- Cluter Manager:指的是在集羣上獲取資源的外部服務。目前有三種類型
-
- Standalon : spark原生的資源管理,由Master負責資源的分配
- Apache Mesos:與hadoop MR兼容性良好的一種資源調度框架
- Hadoop Yarn: 主要是指Yarn中的ResourceManager
- Worker: 集羣中任何能夠運行Application代碼的節點,在Standalone模式中指的是經過slave文件配置的Worker節點,在Spark on Yarn模式下就是NoteManager節點
- Task: 被送到某個Executor上的工做單元,但hadoopMR中的MapTask和ReduceTask概念同樣,是運行Application的基本單位,多個Task組成一個Stage,而Task的調度和管理等是由TaskScheduler負責
- Job: 包含多個Task組成的並行計算,每每由Spark Action觸發生成, 一個Application中每每會產生多個Job
- Stage: 每一個Job會被拆分紅多組Task, 做爲一個TaskSet, 其名稱爲Stage,Stage的劃分和調度是有DAGScheduler來負責的,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種,Stage的邊界就是發生shuffle的地方
- DAGScheduler: 根據Job構建基於Stage的DAG(Directed Acyclic Graph有向無環圖),並提交Stage給TASkScheduler。 其劃分Stage的依據是RDD之間的依賴的關係找出開銷最小的調度方法,以下圖
- TASKSedulter: 將TaskSET提交給worker運行,每一個Executor運行什麼Task就是在此處分配的. TaskScheduler維護全部TaskSet,當Executor向Driver發生心跳時,TaskScheduler會根據資源剩餘狀況分配相應的Task。另外TaskScheduler還維護着全部Task的運行標籤,重試失敗的Task。下圖展現了TaskScheduler的做用
- 在不一樣運行模式中任務調度器具體爲:
-
- Spark on Standalone模式爲TaskScheduler
- YARN-Client模式爲YarnClientClusterScheduler
- YARN-Cluster模式爲YarnClusterScheduler
- 將這些術語串起來的運行層次圖以下:
- Job=多個stage,Stage=多個同種task, Task分爲ShuffleMapTask和ResultTask,Dependency分爲ShuffleDependency和NarrowDependency
Spark運行模式:web
- Spark的運行模式多種多樣,靈活多變,部署在單機上時,既能夠用本地模式運行,也能夠用僞分佈模式運行,而當以分佈式集羣的方式部署時,也有衆多的運行模式可供選擇,這取決於集羣的實際狀況,底層的資源調度便可以依賴外部資源調度框架,也可使用Spark內建的Standalone模式。
- 對於外部資源調度框架的支持,目前的實現包括相對穩定的Mesos模式,以及hadoop YARN模式
- 本地模式:經常使用於本地開發測試,本地還分別 local 和 local cluster
YARN-Client
在Yarn-client中,Driver運行在Client上,經過ApplicationMaster向RM獲取資源。本地Driver負責與全部的executor container進行交互,並將最後的結果彙總。結束掉終端,至關於kill掉這個spark應用。apache
由於Driver在客戶端,因此能夠經過webUI訪問Driver的狀態,默認是http://hadoop1:4040訪問,而YARN經過http:// hadoop1:8088訪問安全
- Spark Yarn Client向YARN的ResourceManager申請啓動Application Master。同時在SparkContent初始化中將建立DAGScheduler和TASKScheduler等,因爲咱們選擇的是Yarn-Client模式,程序會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend
- ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,與YARN-Cluster區別的是在該ApplicationMaster不運行SparkContext,只與SparkContext進行聯繫進行資源的分派
- Client中的SparkContext初始化完畢後,與ApplicationMaster創建通信,向ResourceManager註冊,根據任務信息向ResourceManager申請資源(Container)
- 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通訊,要求它在得到的Container中啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向Client中的SparkContext註冊並申請Task
- client中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向Driver彙報運行的狀態和進度,以讓Client隨時掌握各個任務的運行狀態,從而能夠在任務失敗時從新啓動任務
- 應用程序運行完成後,Client的SparkContext向ResourceManager申請註銷並關閉本身
由於是與Client端通訊,因此Client不能關閉。架構
客戶端的Driver將應用提交給Yarn後,Yarn會前後啓動ApplicationMaster和executor,另外ApplicationMaster和executor都 是裝載在container裏運行,container默認的內存是1G,ApplicationMaster分配的內存是driver- memory,executor分配的內存是executor-memory。同時,由於Driver在客戶端,因此程序的運行結果能夠在客戶端顯 示,Driver以進程名爲SparkSubmit的形式存在。app
Yarn-Cluster
- 在YARN-Cluster模式中,當用戶向YARN中提交一個應用程序後,YARN將分兩個階段運行該應用程序:
- 第一個階段是把Spark的Driver做爲一個ApplicationMaster在YARN集羣中先啓動;
- 第二個階段是由ApplicationMaster建立應用程序,而後爲它向ResourceManager申請資源,並啓動Executor來運行Task,同時監控它的整個運行過程,直到運行完成
應用的運行結果不能在客戶端顯示(能夠在history server中查看),因此最好將結果保存在HDFS而非stdout輸出,客戶端的終端顯示的是做爲YARN的job的簡單運行情況,下圖是yarn-cluster模式框架
執行過程: 分佈式
- Spark Yarn Client向YARN中提交應用程序,包括ApplicationMaster程序、啓動ApplicationMaster的命令、須要在Executor中運行的程序等
- ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,其中ApplicationMaster進行SparkContext等的初始化
- ApplicationMaster向ResourceManager註冊,這樣用戶能夠直接經過ResourceManage查看應用程序的運行狀態,而後它將採用輪詢的方式經過RPC協議爲各個任務申請資源,並監控它們的運行狀態直到運行結束
- 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通訊,要求它在得到的Container中啓動CoarseGrainedExecutorBackend,而Executor對象的建立及維護是由CoarseGrainedExecutorBackend負責的,CoarseGrainedExecutorBackend啓動後會向ApplicationMaster中的SparkContext註冊並申請Task。這一點和Standalone模式同樣,只不過SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務的調度,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增長了對Executor的等待邏輯等
- ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向ApplicationMaster彙報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而能夠在任務失敗時從新啓動任務
- 應用程序運行完成後,ApplicationMaster向ResourceManager申請註銷並關閉本身
比之前的更多的理解:
(1)Application Master所在的NodeManager是Yarn隨機分配的,不是在主節點上,下圖是實驗室集羣上跑得一個Spark程序,tseg0是主節點,tseg1~tseg4是workers,IP10.103.240.29指的是tseg3: 函數
(2)在上圖還能夠看出,executor的容器和AM容器是能夠共存的,它們的封裝都是容器;
(3)AM是Yarn啓動的第一個容器;
(4)AM所在的NodeManager就是日常說的Driver端,由於這個AM啓動了SparkContext,以前實驗室說的「誰初始化的SparkContext誰就是Driver端」一直理解錯了,覺得這句話是相對於機器說的,但實際上是相對於Cluster和Client的集羣模式來講的(不知道其餘模式Mesos、standalone是否是也是這樣)。
(5)在Application提交到RM上以後,Client就能夠關閉了,集羣會繼續運行提交的程序,在實際使用時,有時候會看到這樣一種現象,關閉Client會致使程序終止,其實這個Application尚未提交上去,關閉Client打斷了提交的過程,Application固然不會運行。oop
YARN-Cluster和YARN-Client的區別
- 理解YARN-Client和YARN-Cluster深層次的區別以前先清楚一個概念:Application Master。在YARN中,每一個Application實例都有一個ApplicationMaster進程,它是Application啓動的第一個容器。它負責和ResourceManager打交道並請求資源,獲取資源以後告訴NodeManager爲其啓動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的區別其實就是ApplicationMaster進程的區別
- YARN-Cluster模式下,Driver運行在AM(Application Master)中,它負責向YARN申請資源,並監督做業的運行情況。當用戶提交了做業以後,就能夠關掉Client,做業會繼續在YARN上運行,於是YARN-Cluster模式不適合運行交互類型的做業
- YARN-Client模式下,Application Master僅僅向YARN請求Executor,Client會和請求的Container通訊來調度他們工做,也就是說Client不能離開
(1)YarnCluster的Driver是在集羣的某一臺NM上,可是Yarn-Client就是在RM的機器上;
(2)而Driver會和Executors進行通訊,因此Yarn_cluster在提交App以後能夠關閉Client,而Yarn-Client不能夠;
(3)Yarn-Cluster適合生產環境,Yarn-Client適合交互和調試。
下表是Spark Standalone與Spark On Yarn模式下的比較
Reference
- 《Spark技術內幕-深刻解析Spark內核、架構設計與實現原理》
- Spark Yarn-cluster與Yarn-client
- Spark:Yarn Cluster 和Yarn Client的區別和聯繫
- Spark on YARN兩種運行模式介紹
- Apache Spark Resource Management and YARN App Models