轉(zhuǎn)至:https://www.cnblogs.com/ITtangtang/p/7967386.html
Spark On Yarn的優(yōu)勢(shì)
每個(gè)Spark executor作為一個(gè)YARN容器(container)運(yùn)行歧强。Spark可以使得多個(gè)Tasks在同一個(gè)容器(container)里面運(yùn)行
1. Spark支持資源動(dòng)態(tài)共享烛缔,運(yùn)行于Yarn的框架都共享一個(gè)集中配置好的資源池
2. 可以很方便的利用Yarn的資源調(diào)度特性來(lái)做分類凤优、隔離以及優(yōu)先級(jí)控制負(fù)載,擁有更靈活的調(diào)度策略
3. Yarn可以自由地選擇executor數(shù)量
4. Yarn是唯一支持Spark安全的集群管理器详囤,使用Yarn,Spark可以運(yùn)行于Kerberized Hadoop之上,在它們進(jìn)程之間進(jìn)行安全認(rèn)證
我們知道Spark on yarn有兩種模式:yarn-cluster和yarn-client届宠。這兩種模式作業(yè)雖然都是在yarn上面運(yùn)行赐写,但是其中的運(yùn)行方式很不一樣鸟蜡,今天就來(lái)談?wù)凷park on YARN yarn-client模式作業(yè)從提交到運(yùn)行的過程剖析
相關(guān)概念
- **Application: **Appliction都是指用戶編寫的Spark應(yīng)用程序,其中包括一個(gè)Driver功能的代碼和分布在集群中多個(gè)節(jié)點(diǎn)上運(yùn)行的Executor代碼
- **Driver: Spark中的Driver即運(yùn)行上述Application的main函數(shù)并創(chuàng)建SparkContext挺邀,創(chuàng)建SparkContext的目的是為了準(zhǔn)備Spark應(yīng)用程序的運(yùn)行環(huán)境揉忘,在Spark中有SparkContext負(fù)責(zé)與ClusterManager通信,進(jìn)行資源申請(qǐng)端铛、任務(wù)的分配和監(jiān)控等泣矛,當(dāng)Executor部分運(yùn)行完畢后,Driver同時(shí)負(fù)責(zé)將SparkContext關(guān)閉禾蚕,通常用SparkContext代表Driver
- Executor: 某個(gè)Application運(yùn)行在worker節(jié)點(diǎn)上的一個(gè)進(jìn)程您朽, 該進(jìn)程負(fù)責(zé)運(yùn)行某些Task, 并且負(fù)責(zé)將數(shù)據(jù)存到內(nèi)存或磁盤上换淆,每個(gè)Application都有各自獨(dú)立的一批Executor哗总, 在Spark on Yarn模式下,其進(jìn)程名稱為CoarseGrainedExecutor Backend倍试。一個(gè)CoarseGrainedExecutor Backend有且僅有一個(gè)Executor對(duì)象讯屈, 負(fù)責(zé)將Task包裝成taskRunner,并從線程池中抽取一個(gè)空閑線程運(yùn)行Task, 這個(gè)每一個(gè)oarseGrainedExecutor Backend能并行運(yùn)行Task的數(shù)量取決與分配給它的cpu個(gè)數(shù)
- Cluter Manager:指的是在集群上獲取資源的外部服務(wù)易猫。目前有三種類型
- Standalon : spark原生的資源管理耻煤,由Master負(fù)責(zé)資源的分配
- Apache Mesos:與hadoop MR兼容性良好的一種資源調(diào)度框架
- Hadoop Yarn: 主要是指Yarn中的ResourceManager
Worker: 集群中任何可以運(yùn)行Application代碼的節(jié)點(diǎn),在Standalone模式中指的是通過slave文件配置的Worker節(jié)點(diǎn)准颓,在Spark on Yarn模式下就是NoteManager節(jié)點(diǎn)
Task: 被送到某個(gè)Executor上的工作單元哈蝇,但hadoopMR中的MapTask和ReduceTask概念一樣,是運(yùn)行Application的基本單位攘已,多個(gè)Task組成一個(gè)Stage炮赦,而Task的調(diào)度和管理等是由TaskScheduler負(fù)責(zé)
Job: 包含多個(gè)Task組成的并行計(jì)算,往往由Spark Action觸發(fā)生成样勃, 一個(gè)Application中往往會(huì)產(chǎn)生多個(gè)Job
Stage: 每個(gè)Job會(huì)被拆分成多組Task吠勘, 作為一個(gè)TaskSet性芬, 其名稱為Stage,Stage的劃分和調(diào)度是有DAGScheduler來(lái)負(fù)責(zé)的剧防,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種植锉,Stage的邊界就是發(fā)生shuffle的地方
**DAGScheduler: **根據(jù)Job構(gòu)建基于Stage的DAG(Directed Acyclic Graph有向無(wú)環(huán)圖),并提交Stage給TASkScheduler峭拘。 其劃分Stage的依據(jù)是RDD之間的依賴的關(guān)系找出開銷最小的調(diào)度方法俊庇,如下圖
[圖片上傳失敗...(image-3b898e-1592274191580)]
TASKSedulter: 將TaskSET提交給worker運(yùn)行,每個(gè)Executor運(yùn)行什么Task就是在此處分配的. TaskScheduler維護(hù)所有TaskSet鸡挠,當(dāng)Executor向Driver發(fā)生心跳時(shí)辉饱,TaskScheduler會(huì)根據(jù)資源剩余情況分配相應(yīng)的Task。另外TaskScheduler還維護(hù)著所有Task的運(yùn)行標(biāo)簽拣展,重試失敗的Task彭沼。下圖展示了TaskScheduler的作用
[圖片上傳失敗...(image-2bfede-1592274191580)]
在不同運(yùn)行模式中任務(wù)調(diào)度器具體為:
- Spark on Standalone模式為TaskScheduler
- YARN-Client模式為YarnClientClusterScheduler
- YARN-Cluster模式為YarnClusterScheduler
將這些術(shù)語(yǔ)串起來(lái)的運(yùn)行層次圖如下:
[圖片上傳失敗...(image-7f9cb4-1592274191580)]
Job=多個(gè)stage,Stage=多個(gè)同種task, Task分為ShuffleMapTask和ResultTask备埃,Dependency分為ShuffleDependency和NarrowDependency
Spark運(yùn)行模式:
- Spark的運(yùn)行模式多種多樣姓惑,靈活多變,部署在單機(jī)上時(shí)瓜喇,既可以用本地模式運(yùn)行挺益,也可以用偽分布模式運(yùn)行,而當(dāng)以分布式集群的方式部署時(shí)乘寒,也有眾多的運(yùn)行模式可供選擇,這取決于集群的實(shí)際情況匪补,底層的資源調(diào)度即可以依賴外部資源調(diào)度框架伞辛,也可以使用Spark內(nèi)建的Standalone模式。
- 對(duì)于外部資源調(diào)度框架的支持夯缺,目前的實(shí)現(xiàn)包括相對(duì)穩(wěn)定的Mesos模式蚤氏,以及hadoop YARN模式
- 本地模式:常用于本地開發(fā)測(cè)試,本地還分別 local 和 local cluster
YARN-Client
在Yarn-client中踊兜,Driver運(yùn)行在Client上竿滨,通過ApplicationMaster向RM獲取資源。本地Driver負(fù)責(zé)與所有的executor container進(jìn)行交互捏境,并將最后的結(jié)果匯總于游。結(jié)束掉終端,相當(dāng)于kill掉這個(gè)spark應(yīng)用垫言。
因?yàn)镈river在客戶端贰剥,所以可以通過webUI訪問Driver的狀態(tài),默認(rèn)是http://hadoop1:4040訪問筷频,而YARN通過http:// hadoop1:8088訪問
- YARN-client的工作流程步驟為:
- Spark Yarn Client向YARN的ResourceManager申請(qǐng)啟動(dòng)Application Master蚌成。同時(shí)在SparkContent初始化中將創(chuàng)建DAGScheduler和TASKScheduler等前痘,由于我們選擇的是Yarn-Client模式,程序會(huì)選擇YarnClientClusterScheduler和YarnClientSchedulerBackend
- ResourceManager收到請(qǐng)求后担忧,在集群中選擇一個(gè)NodeManager芹缔,為該應(yīng)用程序分配第一個(gè)Container,要求它在這個(gè)Container中啟動(dòng)應(yīng)用程序的ApplicationMaster瓶盛,與YARN-Cluster區(qū)別的是在該ApplicationMaster不運(yùn)行SparkContext乖菱,只與SparkContext進(jìn)行聯(lián)系進(jìn)行資源的分派
- Client中的SparkContext初始化完畢后,與ApplicationMaster建立通訊蓬网,向ResourceManager注冊(cè)窒所,根據(jù)任務(wù)信息向ResourceManager申請(qǐng)資源(Container)
- 一旦ApplicationMaster申請(qǐng)到資源(也就是Container)后,便與對(duì)應(yīng)的NodeManager通信帆锋,要求它在獲得的Container中啟動(dòng)CoarseGrainedExecutorBackend吵取,CoarseGrainedExecutorBackend啟動(dòng)后會(huì)向Client中的SparkContext注冊(cè)并申請(qǐng)Task
- client中的SparkContext分配Task給CoarseGrainedExecutorBackend執(zhí)行,CoarseGrainedExecutorBackend運(yùn)行Task并向Driver匯報(bào)運(yùn)行的狀態(tài)和進(jìn)度锯厢,以讓Client隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài)皮官,從而可以在任務(wù)失敗時(shí)重新啟動(dòng)任務(wù)
- 應(yīng)用程序運(yùn)行完成后,Client的SparkContext向ResourceManager申請(qǐng)注銷并關(guān)閉自己
因?yàn)槭桥cClient端通信实辑,所以Client不能關(guān)閉捺氢。
客戶端的Driver將應(yīng)用提交給Yarn后,Yarn會(huì)先后啟動(dòng)ApplicationMaster和executor剪撬,另外ApplicationMaster和executor都 是裝載在container里運(yùn)行摄乒,container默認(rèn)的內(nèi)存是1G,ApplicationMaster分配的內(nèi)存是driver- memory残黑,executor分配的內(nèi)存是executor-memory馍佑。同時(shí),因?yàn)镈river在客戶端梨水,所以程序的運(yùn)行結(jié)果可以在客戶端顯 示拭荤,Driver以進(jìn)程名為SparkSubmit的形式存在。
Yarn-Cluster
- 在YARN-Cluster模式中疫诽,當(dāng)用戶向YARN中提交一個(gè)應(yīng)用程序后舅世,YARN將分兩個(gè)階段運(yùn)行該應(yīng)用程序:
- 第一個(gè)階段是把Spark的Driver作為一個(gè)ApplicationMaster在YARN集群中先啟動(dòng);
- 第二個(gè)階段是由ApplicationMaster創(chuàng)建應(yīng)用程序奇徒,然后為它向ResourceManager申請(qǐng)資源雏亚,并啟動(dòng)Executor來(lái)運(yùn)行Task,同時(shí)監(jiān)控它的整個(gè)運(yùn)行過程逼龟,直到運(yùn)行完成
應(yīng)用的運(yùn)行結(jié)果不能在客戶端顯示(可以在history server中查看)评凝,所以最好將結(jié)果保存在HDFS而非stdout輸出,客戶端的終端顯示的是作為YARN的job的簡(jiǎn)單運(yùn)行狀況腺律,下圖是yarn-cluster模式
[圖片上傳失敗...(image-107978-1592274191581)]
執(zhí)行過程:
- Spark Yarn Client向YARN中提交應(yīng)用程序奕短,包括ApplicationMaster程序宜肉、啟動(dòng)ApplicationMaster的命令、需要在Executor中運(yùn)行的程序等
- ResourceManager收到請(qǐng)求后翎碑,在集群中選擇一個(gè)NodeManager谬返,為該應(yīng)用程序分配第一個(gè)Container,要求它在這個(gè)Container中啟動(dòng)應(yīng)用程序的ApplicationMaster日杈,其中ApplicationMaster進(jìn)行SparkContext等的初始化
- ApplicationMaster向ResourceManager注冊(cè)遣铝,這樣用戶可以直接通過ResourceManage查看應(yīng)用程序的運(yùn)行狀態(tài),然后它將采用輪詢的方式通過RPC協(xié)議為各個(gè)任務(wù)申請(qǐng)資源莉擒,并監(jiān)控它們的運(yùn)行狀態(tài)直到運(yùn)行結(jié)束
- 一旦ApplicationMaster申請(qǐng)到資源(也就是Container)后酿炸,便與對(duì)應(yīng)的NodeManager通信,要求它在獲得的Container中啟動(dòng)CoarseGrainedExecutorBackend涨冀,而Executor對(duì)象的創(chuàng)建及維護(hù)是由CoarseGrainedExecutorBackend負(fù)責(zé)的填硕,CoarseGrainedExecutorBackend啟動(dòng)后會(huì)向ApplicationMaster中的SparkContext注冊(cè)并申請(qǐng)Task。這一點(diǎn)和Standalone模式一樣鹿鳖,只不過SparkContext在Spark Application中初始化時(shí)扁眯,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進(jìn)行任務(wù)的調(diào)度,其中YarnClusterScheduler只是對(duì)TaskSchedulerImpl的一個(gè)簡(jiǎn)單包裝翅帜,增加了對(duì)Executor的等待邏輯等
- ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執(zhí)行姻檀,CoarseGrainedExecutorBackend運(yùn)行Task并向ApplicationMaster匯報(bào)運(yùn)行的狀態(tài)和進(jìn)度,以讓ApplicationMaster隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài)涝滴,從而可以在任務(wù)失敗時(shí)重新啟動(dòng)任務(wù)
- 應(yīng)用程序運(yùn)行完成后绣版,ApplicationMaster向ResourceManager申請(qǐng)注銷并關(guān)閉自己
比以前的更多的理解:
(1)Application Master所在的NodeManager是Yarn隨機(jī)分配的,不是在主節(jié)點(diǎn)上狭莱,下圖是實(shí)驗(yàn)室集群上跑得一個(gè)Spark程序僵娃,tseg0是主節(jié)點(diǎn),tseg1~tseg4是workers腋妙,IP10.103.240.29指的是tseg3:
(2)在上圖還可以看出,executor的容器和AM容器是可以共存的讯榕,它們的封裝都是容器骤素;
(3)AM是Yarn啟動(dòng)的第一個(gè)容器;
(4)AM所在的NodeManager就是平常說(shuō)的Driver端愚屁,因?yàn)檫@個(gè)AM啟動(dòng)了SparkContext济竹,之前實(shí)驗(yàn)室說(shuō)的“誰(shuí)初始化的SparkContext誰(shuí)就是Driver端”一直理解錯(cuò)了,以為這句話是相對(duì)于機(jī)器說(shuō)的霎槐,但其實(shí)是相對(duì)于Cluster和Client的集群模式來(lái)說(shuō)的(不知道其他模式Mesos送浊、standalone是不是也是這樣)。
(5)在Application提交到RM上之后丘跌,Client就可以關(guān)閉了袭景,集群會(huì)繼續(xù)運(yùn)行提交的程序唁桩,在實(shí)際使用時(shí),有時(shí)候會(huì)看到這樣一種現(xiàn)象耸棒,關(guān)閉Client會(huì)導(dǎo)致程序終止荒澡,其實(shí)這個(gè)Application還沒有提交上去,關(guān)閉Client打斷了提交的過程与殃,Application當(dāng)然不會(huì)運(yùn)行单山。
YARN-Cluster和YARN-Client的區(qū)別
- 理解YARN-Client和YARN-Cluster深層次的區(qū)別之前先清楚一個(gè)概念:Application Master。在YARN中幅疼,每個(gè)Application實(shí)例都有一個(gè)ApplicationMaster進(jìn)程米奸,它是Application啟動(dòng)的第一個(gè)容器。它負(fù)責(zé)和ResourceManager打交道并請(qǐng)求資源爽篷,獲取資源之后告訴NodeManager為其啟動(dòng)Container悴晰。從深層次的含義講YARN-Cluster和YARN-Client模式的區(qū)別其實(shí)就是ApplicationMaster進(jìn)程的區(qū)別
- YARN-Cluster模式下,Driver運(yùn)行在AM(Application Master)中狼忱,它負(fù)責(zé)向YARN申請(qǐng)資源膨疏,并監(jiān)督作業(yè)的運(yùn)行狀況。當(dāng)用戶提交了作業(yè)之后钻弄,就可以關(guān)掉Client佃却,作業(yè)會(huì)繼續(xù)在YARN上運(yùn)行,因而YARN-Cluster模式不適合運(yùn)行交互類型的作業(yè)
- YARN-Client模式下窘俺,Application Master僅僅向YARN請(qǐng)求Executor饲帅,Client會(huì)和請(qǐng)求的Container通信來(lái)調(diào)度他們工作,也就是說(shuō)Client不能離開
(1)YarnCluster的Driver是在集群的某一臺(tái)NM上瘤泪,但是Yarn-Client就是在RM的機(jī)器上灶泵;
(2)而Driver會(huì)和Executors進(jìn)行通信,所以Yarn_cluster在提交App之后可以關(guān)閉Client对途,而Yarn-Client不可以赦邻;
(3)Yarn-Cluster適合生產(chǎn)環(huán)境,Yarn-Client適合交互和調(diào)試实檀。
下表是Spark Standalone與Spark On Yarn模式下的比較
Reference
- 《Spark技術(shù)內(nèi)幕-深入解析Spark內(nèi)核惶洲、架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理》
- Spark Yarn-cluster與Yarn-client
- Spark:Yarn Cluster 和Yarn Client的區(qū)別和聯(lián)系
- Spark on YARN兩種運(yùn)行模式介紹
- Apache Spark Resource Management and YARN App Models