Spark On Yarn的兩種模式y(tǒng)arn-cluster和yarn-client深度剖析

轉(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)行

image

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ù)易猫。目前有三種類型
    1. Standalon : spark原生的資源管理耻煤,由Master負(fù)責(zé)資源的分配
    2. Apache Mesos:與hadoop MR兼容性良好的一種資源調(diào)度框架
    3. 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)度器具體為:

    1. Spark on Standalone模式為TaskScheduler
    2. YARN-Client模式為YarnClientClusterScheduler
    3. 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的工作流程步驟為:
image
image
  • 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)用程序:
  1. 第一個(gè)階段是把Spark的Driver作為一個(gè)ApplicationMaster在YARN集群中先啟動(dòng);
  2. 第二個(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

[圖片上傳失敗...(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:

image

(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模式下的比較


image.png

Reference

  1. 《Spark技術(shù)內(nèi)幕-深入解析Spark內(nèi)核惶洲、架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理》
  2. Spark Yarn-cluster與Yarn-client
  3. Spark:Yarn Cluster 和Yarn Client的區(qū)別和聯(lián)系
  4. Spark on YARN兩種運(yùn)行模式介紹
  5. Apache Spark Resource Management and YARN App Models
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膳犹,隨后出現(xiàn)的幾起案子恬吕,更是在濱河造成了極大的恐慌,老刑警劉巖须床,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐料,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钠惩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門柒凉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人妻柒,你說(shuō)我怎么就攤上這事扛拨。” “怎么了举塔?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵绑警,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我央渣,道長(zhǎng)计盒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任芽丹,我火速辦了婚禮北启,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拔第。我一直安慰自己咕村,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布蚊俺。 她就那樣靜靜地躺著懈涛,像睡著了一般耍铜。 火紅的嫁衣襯著肌膚如雪沛鸵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天怠苔,我揣著相機(jī)與錄音得封,去河邊找鬼埋心。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忙上,可吹牛的內(nèi)容都是我干的拷呆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疫粥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洋腮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起手形,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悯恍,沒想到半個(gè)月后库糠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年瞬欧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贷屎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艘虎,死狀恐怖唉侄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情野建,我是刑警寧澤属划,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站候生,受9級(jí)特大地震影響同眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唯鸭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一须蜗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧目溉,春花似錦明肮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蛉腌,卻和暖如春官份,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烙丛。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工舅巷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人河咽。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓钠右,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忘蟹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子飒房,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354