Spark2.x---6. Spark Yarn Client模式解析

最近在定位Yarn的crash問題時(shí),順便把spark怎么使用yarn的好好的梳理了一遍晌杰。不過我先了解一下Yarn和怎么提交yarn的job的。

首先我們先看看Yarn的架構(gòu):



圖1 Yarn分布式架構(gòu)

ResourceManager

a)一個(gè)純粹的調(diào)度器

b)根據(jù)應(yīng)用程序的資源請(qǐng)求嚴(yán)格限制系統(tǒng)的可用資源

c)在保證容量筷弦、公平性及服務(wù)等級(jí)的情況下肋演,優(yōu)化集群資源利用率,讓所有資源都得到充分的利用

d)由可插拔的調(diào)度器來應(yīng)用不同的調(diào)度算法烂琴,如注重容量調(diào)度還是注意公平調(diào)度

ApplicationManager

a)負(fù)責(zé)與ResourceManager協(xié)商資源爹殊,并和NodeManager協(xié)同工作來執(zhí)行和監(jiān)控Container以及他們的資源消耗

b)有責(zé)任與ResourceManager協(xié)商并獲取合適的資源Container,跟蹤他們的狀態(tài)奸绷,以及監(jiān)控其進(jìn)展

c)在真實(shí)環(huán)境中梗夸,每一個(gè)應(yīng)用都有自己的ApplicationMaster的實(shí)例,但是也可為一組提供一個(gè)ApplicationMaster号醉,比如Pig或者Hive的ApplicationMaster

一反症、Yarn

Client編寫

1.創(chuàng)建Yarn客戶端

YarnClient yarnClient =

YarnClient.createYarnClien。t();

yarnClient.init(conf);

yarnClient.start();

2.創(chuàng)建Yarn應(yīng)用

YarnClientApplication app =yarnClient.createApplication();

3.設(shè)置Applicaton的名字畔派,內(nèi)存和cpu需求以及優(yōu)先級(jí)和Queue信息铅碍,YARN將根據(jù)這些信息來調(diào)度AppMaster

app.getApplicationSubmissionContext().setApplicationName("jenkins.ApplicationMaster");

app.getApplicationSubmissionContext().setResource(Resource.newInstance(100,1));

app.getApplicationSubmissionContext().setPriority(Priority.newInstance(0));

app.getApplicationSubmissionContext().setQueue("default");

4.設(shè)置ContainerLaunchContext,這一步,amContainer中包含了App Master執(zhí)行需要的資源文件线椰,環(huán)境變量和啟動(dòng)命令胞谈,這里將資源文件上傳到了HDFS,這樣在NODE Manager就可以通過HDFS取得這些文件

app.getApplicationSubmissionContext().setAMContainerSpec(amContainer);

5.提交應(yīng)用

ApplicationId appId =yarnClient.submitApplication(app.getApplicationSubmissionContext());

二、YARN ApplicationMaster編寫

ApplicationMaster編寫的編寫比較復(fù)雜烦绳,其需要通Resource Manager和Node Manager交互悔叽,

通過ResourceManager:申請(qǐng)Container,并接收Resource Manager的一些消息爵嗅,如可用的Container,結(jié)束的Container等笨蚁。

通過NodeManage:啟動(dòng)Container睹晒,并接收Node Manage的一些消息,如Container的狀態(tài)變化以及Node狀態(tài)變化括细。

1.創(chuàng)建一個(gè)AMRMClientAsync對(duì)象伪很,這個(gè)對(duì)象負(fù)責(zé)與Resource

Manager交互

amRMClient= AMRMClientAsync.createAMRMClientAsync( 1000, new RMCallbackHandler());

這里的RMCallbackHandler是我們編寫的繼承自AMRMClientAsync.CallbackHandler的一個(gè)類,其功能是處理由Resource

Manager收到的消息,

其需要實(shí)現(xiàn)的方法由如下

publicvoid onContainersCompleted(List statuses);

publicvoid onContainersAllocated(List containers) ;

publicvoid onShutdownRequest() ;

publicvoid onNodesUpdated(List updatedNodes) ;

publicvoid onError(Throwable e) ;

這里不考慮異常的情況下奋单,只寫onContainersAllocated锉试,onContainersCompleted這兩個(gè)既可以,一個(gè)是當(dāng)有新的Container可以使用览濒,一個(gè)是Container運(yùn)行結(jié)束呆盖。

在onContainersAllocated我們需要編寫啟動(dòng)container的代碼,amNMClient.startContainerAsync(container, ctx);這里的ctx同Yarn Client中第4步中的amContainer是同一個(gè)類型贷笛,即這個(gè)container執(zhí)行的一些資源应又,環(huán)境變量與命令等,因?yàn)檫@是在回調(diào)函數(shù)中乏苦,為了保證時(shí)效性株扛,這個(gè)操作最好放在線程池中異步操作。

在onContainersCompleted中汇荐,如果是失敗的Container洞就,我們需要重新申請(qǐng)并啟動(dòng)Container,(這一點(diǎn)有可能是YARN的Fair Schedule中會(huì)強(qiáng)制退出某些Container以釋放資源)成功的將做記錄既可以掀淘。

2.創(chuàng)建一個(gè)NMClientAsyncImpl對(duì)象旬蟋,這個(gè)對(duì)象負(fù)責(zé)與Node

Manager交互

amNMClient= new NMClientAsyncImpl(new NMCallbackHandler());

這里NMCallbackHandler使我們需要編寫的繼承自NMClientAsync.CallbackHandler的對(duì)象,其功能是處理由Node

Manager收到的消息

publicvoid onContainerStarted(ContainerId containerId,MapallServiceResponse);

publicvoid onContainerStatusReceived(ContainerId containerId,ContainerStatus containerStatus);

publicvoid onContainerStopped(ContainerId containerId) ;

publicvoid onStartContainerError(ContainerId containerId, Throwable t);

publicvoid onGetContainerStatusError(ContainerId containerId,Throwable t) ;

publicvoid onStopContainerError(ContainerId containerId, Throwable t);

這里簡(jiǎn)單的不考慮異常的情況下革娄,這些函數(shù)可以寫一個(gè)空函數(shù)體咖为,忽略掉處理

3.將ApplicationMaster注冊(cè)到Resource

Manager上

RegisterApplicationMasterResponseresponse = amRMClient.registerApplicationMaster(NetUtils.getHostname(), -1,"");

這個(gè)函數(shù)將自己注冊(cè)到RM上,這里沒有提供RPC

port和TrackURL.

4. ApplicationMaster向Resource

Manager申請(qǐng)Container

ContainerRequestcontainerAsk = new ContainerRequest(

//100*10M + 1vcpu

Resource.newInstance(100, 1), null, null,

Priority.newInstance(0));

amRMClient.addContainerRequest(containerAsk);

這里一個(gè)containerAsk表示申請(qǐng)一個(gè)Container稠腊,這里的對(duì)nodes和rasks設(shè)置為NULL躁染,猜測(cè)MapReduce應(yīng)該由參數(shù)來嘗試申請(qǐng)靠近HDFS

block的container的

5.申請(qǐng)到Container后,回調(diào)AMRMClientAsync.CallbackHandler的onContainersAllocated就會(huì)響應(yīng)架忌,然后通過amNMClient在Container運(yùn)行計(jì)算任務(wù):

Listcommands = new LinkedList();

commands.add("sleep" + sleepSeconds.addAndGet(1));

ContainerLaunchContextctx = ContainerLaunchContext.newInstance(null, null, commands, null, null,null);

amNMClient.startContainerAsync(container,ctx);

6.等待Container執(zhí)行完畢吞彤,清理退出

我的代碼如下,循環(huán)等待container執(zhí)行完畢,并上報(bào)執(zhí)行結(jié)果

voidwaitComplete() throws YarnException, IOException{

while(numTotalContainers.get() !=numCompletedConatiners.get()){

try{

Thread.sleep(1000);

LOG.info("waitComplete"+

", numTotalContainers=" +numTotalContainers.get() +

", numCompletedConatiners=" +numCompletedConatiners.get());

} catch (InterruptedException ex){}

}

exeService.shutdown()饰恕;

amNMClient.stop();

amRMClient.unregisterApplicationMaster(FinalApplicationStatus.SUCCEEDED,"dummy Message", null)挠羔;

amRMClient.stop();

}

三、YARN Container Application

真正處理數(shù)據(jù)的是由ApplicationMaster由amNMClient.startContainerAsync(container, ctx)提交的Containerapplication,然后這這個(gè)應(yīng)用并不需要特殊編寫埋嵌,任何程序通過提交相應(yīng)的運(yùn)行信息都可以在這些Node中的某個(gè)Container中執(zhí)行破加,所以這個(gè)程序可以是一個(gè)復(fù)雜的MapReduce Task或者是一個(gè)簡(jiǎn)單的腳本。

總結(jié):

YARN提供了對(duì)cluster資源管理和作業(yè)調(diào)度的功能雹嗦。

編寫一個(gè)應(yīng)用運(yùn)行在YARN之上范舀,比較復(fù)雜的是ApplicationMaster的編寫,其需要維護(hù)container的狀態(tài)并能共做一些錯(cuò)誤恢復(fù)了罪,重啟應(yīng)用的操作锭环。比較簡(jiǎn)答的是Client的編寫,只需要提交必須的信息既可以泊藕,不需要維護(hù)狀態(tài)辅辩。真正運(yùn)行處理數(shù)據(jù)的是Container Application,這個(gè)程序可以不需要針對(duì)YARN做代碼編寫

四娃圆、Spark Yarn Client模式

Spark Yarn有兩種模式玫锋,一直是client模式,一種是cluster模式讼呢,今天我們先說說client模式景醇,以下是Spark YarnClient的交互圖。


圖2 Spark Yarn Client模式


圖3 Spark Yarn類圖?


圖4 Spark Yarn Client模式j(luò)ob提交過程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吝岭,一起剝皮案震驚了整個(gè)濱河市三痰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窜管,老刑警劉巖散劫,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幕帆,居然都是意外死亡获搏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門失乾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來常熙,“玉大人,你說我怎么就攤上這事碱茁÷阄溃” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵纽竣,是天一觀的道長(zhǎng)墓贿。 經(jīng)常有香客問我茧泪,道長(zhǎng),這世上最難降的妖魔是什么聋袋? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任队伟,我火速辦了婚禮,結(jié)果婚禮上幽勒,老公的妹妹穿的比我還像新娘嗜侮。我一直安慰自己,他們只是感情好啥容,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布锈颗。 她就那樣靜靜地躺著,像睡著了一般干毅。 火紅的嫁衣襯著肌膚如雪泼返。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天渠鸽,我揣著相機(jī)與錄音,去河邊找鬼柴罐。 笑死徽缚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凿试。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼那婉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了党瓮?” 一聲冷哼從身側(cè)響起详炬,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寞奸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隐岛,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓷翻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了元践。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韭脊。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沪羔,死狀恐怖象浑,靈堂內(nèi)的尸體忽然破棺而出蔫饰,到底是詐尸還是另有隱情愉豺,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布杖剪,位于F島的核電站驰贷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏括袒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一芥炭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恃慧,春花似錦蚤认、人聲如沸糕伐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥蚯。三九已至,卻和暖如春赞庶,著一層夾襖步出監(jiān)牢的瞬間澳骤,已是汗流浹背澜薄。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颊艳,地道東北人忘分。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像重斑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窥浪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容