Spark各個組件的概念溉箕,Driver進(jìn)程
spark應(yīng)用涉及的一些基本概念:
1.mater:主要是控制晦墙、管理和監(jiān)督整個spark集群
2.client:客戶端,將用應(yīng)用程序提交肴茄,記錄著要業(yè)務(wù)運行邏輯和master通訊晌畅。
3.sparkContext:spark應(yīng)用程序的入口,負(fù)責(zé)調(diào)度各個運算資源寡痰,協(xié)調(diào)各個work node上的Executor抗楔。主要是一些記錄信息,記錄誰運行的拦坠,運行的情況如何等连躏。這也是為什么編程的時候必須要創(chuàng)建一個sparkContext的原因了。
4.Driver Program:每個應(yīng)用的主要管理者贞滨,每個應(yīng)用的老大入热,有人可能問不是有master么怎么還來一個?因為master是集群的老大晓铆,每個應(yīng)用都?xì)w老大管勺良,那老大瘋了。因此driver負(fù)責(zé)具體事務(wù)運行并跟蹤骄噪,運行Application的main()函數(shù)并創(chuàng)建sparkContext尚困。
5.RDD:spark的核心數(shù)據(jù)結(jié)構(gòu),可以通過一系列算子進(jìn)行操作链蕊,當(dāng)Rdd遇到Action算子時事甜,將之前的所有的算子形成一個有向無環(huán)圖(DAG)谬泌。再在spark中轉(zhuǎn)化成為job,提交到集群執(zhí)行逻谦。一個app可以包含多個job
6.worker Node:集群的工作節(jié)點掌实,可以運行Application代碼的節(jié)點,接收mater的命令并且領(lǐng)取運行任務(wù)跨跨,同時匯報執(zhí)行的進(jìn)度和結(jié)果給master潮峦,節(jié)點上運行一個或者多個Executor進(jìn)程囱皿。
7.exector:為application運行在workerNode上的一個進(jìn)程勇婴,該進(jìn)程負(fù)責(zé)運行Task,并且負(fù)責(zé)將數(shù)據(jù)存在內(nèi)存或者磁盤上嘱腥。每個application都會申請各自的Executor來處理任務(wù)耕渴。
spark應(yīng)用(Application)執(zhí)行過程中各個組件的概念:
1.Task(任務(wù)):RDD中的一個分區(qū)對應(yīng)一個task,task是單個分區(qū)上最小的處理流程單元齿兔。
2.TaskSet(任務(wù)集):一組關(guān)聯(lián)的橱脸,但相互之間沒有Shuffle依賴關(guān)系的Task集合。
3.Stage(調(diào)度階段):一個taskSet對應(yīng)的調(diào)度階段分苇,每個job會根據(jù)RDD的寬依賴關(guān)系被切分很多Stage添诉,每個stage都包含 一個TaskSet。
4.job(作業(yè)):由Action算子觸發(fā)生成的由一個或者多個stage組成的計算作業(yè)医寿。
5.application:用戶編寫的spark應(yīng)用程序栏赴,由一個或者多個job組成,提交到spark之后靖秩,spark為application分派資源须眷,將程序轉(zhuǎn)換并執(zhí)行。
6.DAGScheduler:根據(jù)job構(gòu)建基于stage的DAG沟突,并提交stage給TaskScheduler花颗。
7.TaskScheduler:將Taskset提交給Worker Node集群運行并返回結(jié)果。
spark基本概念之間的關(guān)系
一個Application可以由一個或者多個job組成惠拭,一個job可以由一個或者多個stage組成扩劝,其中stage是根據(jù)寬窄依賴進(jìn)行劃分的,一個stage由一個taskset組成职辅,一個TaskSET可以由一個到多個task組成今野。
spark使用driver進(jìn)程負(fù)責(zé)應(yīng)用的解析,切分Stage并且調(diào)度task到Executor執(zhí)行,包含DAGscheduler等重要對象罐农。Driver進(jìn)程的運行地點有如下兩種:
1.driver進(jìn)程運行在client端条霜,對應(yīng)用進(jìn)行管理監(jiān)控。
2.Master節(jié)點指定某個Worker節(jié)點啟動Driver進(jìn)程涵亏,負(fù)責(zé)監(jiān)控整個應(yīng)用的執(zhí)行宰睡。
driver運行在client
用戶啟動Client端蒲凶,在client端啟動Driver進(jìn)程。在Driver中啟動或?qū)嵗疍AGScheduler等組件拆内。
1.driver在client啟動旋圆,做好準(zhǔn)備工作,計劃好任務(wù)的策略和方式(DAGScheduler)后向Master注冊并申請運行Executor資源麸恍。
2.Worker向Master注冊灵巧,Master通過指令讓worker啟動Executor。
3.worker收到指令后創(chuàng)建ExecutorRunner線程抹沪,進(jìn)而ExecutorRunner線程啟動executorBackend進(jìn)程刻肄。
4.ExecutorBackend啟動后,向client端driver進(jìn)程內(nèi)的SchedulerBackend注冊,這樣dirver進(jìn)程就可以發(fā)現(xiàn)計算資源了融欧。
5.Driver的DAGScheduler解析應(yīng)用中的RDD DAG并生成相應(yīng)的Stage敏弃,每個Stage包含的TaskSet通過TaskScheduler分配給Executor,在Exectutor內(nèi)部啟動線程池并行化執(zhí)行Task噪馏,同事driver會密切注視麦到,如果發(fā)現(xiàn)哪個execuctor執(zhí)行效率低,會分配其他exeuctor頂替執(zhí)行欠肾,觀察誰的效率更高(推測執(zhí)行)瓶颠。
6.計劃中的所有stage被執(zhí)行完了之后,各個worker匯報給driver刺桃,同事釋放資源粹淋,driver確定都做完了,就向master匯報虏肾。同時driver在client上廓啊,應(yīng)用的執(zhí)行進(jìn)度clinet也知道了。
Driver運行在Worker節(jié)點
用戶啟動客戶端封豪,客戶端提交應(yīng)用程序給Master
1.Master調(diào)度應(yīng)用谴轮,指定一個worker節(jié)點啟動driver,即Scheduler-Backend吹埠。
2.worker接收到Master命令后創(chuàng)建driverRunner線程第步,在DriverRunner線程內(nèi)創(chuàng)建SchedulerBackend進(jìn)程,Dirver充當(dāng)整個作業(yè)的主控進(jìn)程缘琅。
3.Master指定其他Worker節(jié)點啟動Exeuctor粘都,此處流程和上面相似,worker創(chuàng)建ExecutorRunner線程刷袍,啟動ExecutorBackend進(jìn)程翩隧。
4.ExecutorBackend啟動后,向client端driver進(jìn)程內(nèi)的SchedulerBackend注冊,這樣dirver進(jìn)程就可以發(fā)現(xiàn)計算資源了呻纹。
5.Driver的DAGScheduler解析應(yīng)用中的RDD DAG并生成相應(yīng)的Stage堆生,每個Stage包含的TaskSet通過TaskScheduler分配給Executor专缠,在Exectutor內(nèi)部啟動線程池并行化執(zhí)行Task,同事driver會密切注視淑仆,如果發(fā)現(xiàn)哪個execuctor執(zhí)行效率低涝婉,會分配其他exeuctor頂替執(zhí)行,觀察誰的效率更高(推測執(zhí)行)蔗怠。
6.計劃中的所有stage被執(zhí)行完了之后墩弯,各個worker匯報給driver,同事釋放資源寞射,driver確定都做完了渔工,就向master匯報〉』蹋客戶也會跳過master直接和drive通訊了解任務(wù)的執(zhí)行進(jìn)度涨缚。
spark的四種分布式運行模式
如圖所示轧粟,上方為spark的架構(gòu)圖策治,spark的組件可以分為四個部分,driver兰吟、cluster Manager通惫、worker和executor
根據(jù)clusterManager的不同,spark可以分成四種不同的運行模式混蔼,standalone履腋、local cluster、spark on yarn 和spark on mesos
standalone模式:
standalone模式既獨立模式惭嚣,自帶完整服務(wù)遵湖,可單獨部署到一個集群中,無需依賴其他任何資源管理系統(tǒng)晚吞,只支持FIFO調(diào)度器延旧。從一定程度上說,它是spark on yarn 和spark on mesos 的基礎(chǔ)槽地。在standalone模式中迁沫,沒有AM和NM的概念,也沒有RM的概念捌蚊,用戶節(jié)點直接與master打交道集畅,由driver負(fù)責(zé)向master申請資源,并由driver進(jìn)行資源的分配和調(diào)度等等缅糟。
localCluster模式:
standalone模式的單機版挺智,master和worker分別運行在一臺機器的不同進(jìn)程上
spark on Yarn模式:
這是一種很有前景的部署模式。但限于YARN自身的發(fā)展窗宦,目前僅支持粗粒度模式(Coarse-grained Mode)赦颇。這是由于YARN上的Container資源是不可以動態(tài)伸縮的谣辞,一旦Container啟動之后,可使用的資源不能再發(fā)生變化沐扳,不過這個已經(jīng)在YARN計劃中了泥从。 spark on yarn 的支持兩種模式:
(1) yarn-cluster:適用于生產(chǎn)環(huán)境;(2) yarn-client:適用于交互沪摄、調(diào)試躯嫉,希望立即看到app的輸出
yarn-cluster和yarn-client的區(qū)別在于yarn appMaster,每個yarn app實例有一個appMaster進(jìn)程杨拐,是為app啟動的第一個container祈餐;負(fù)責(zé)從ResourceManager請求資源,獲取到資源后哄陶,告訴NodeManager為其啟動container帆阳。yarn-cluster和yarn-client模式內(nèi)部實現(xiàn)還是有很大的區(qū)別。如果你需要用于生產(chǎn)環(huán)境屋吨,那么請選擇yarn-cluster蜒谤;而如果你僅僅是Debug程序,可以選擇yarn-client至扰。
spark on mesos模式:
這是很多公司采用的模式鳍徽,官方推薦這種模式(當(dāng)然,原因之一是血緣關(guān)系)敢课。正是由于Spark開發(fā)之初就考慮到支持Mesos阶祭,因此,目前而言直秆,Spark運行在Mesos上會比運行在YARN上更加靈活濒募,更加自然。目前在Spark On Mesos環(huán)境中圾结,用戶可選擇兩種調(diào)度模式之一運行自己的應(yīng)用程序(可參考Andrew Xia的“Mesos Scheduling Mode on Spark”):
粗粒度模式(Coarse-grained Mode):每個應(yīng)用程序的運行環(huán)境由一個Dirver和若干個Executor組成瑰剃,其中,每個Executor占用若干資源疫稿,內(nèi)部可運行多個Task(對應(yīng)多少個“slot”)培他。應(yīng)用程序的各個任務(wù)正式運行之前,需要將運行環(huán)境中的資源全部申請好遗座,且運行過程中要一直占用這些資源舀凛,即使不用,最后程序運行結(jié)束后途蒋,回收這些資源猛遍。舉個例子,比如你提交應(yīng)用程序時,指定使用5個executor運行你的應(yīng)用程序懊烤,每個executor占用5GB內(nèi)存和5個CPU梯醒,每個executor內(nèi)部設(shè)置了5個slot,則Mesos需要先為executor分配資源并啟動它們腌紧,之后開始調(diào)度任務(wù)茸习。另外,在程序運行過程中壁肋,mesos的master和slave并不知道executor內(nèi)部各個task的運行情況号胚,executor直接將任務(wù)狀態(tài)通過內(nèi)部的通信機制匯報給Driver,從一定程度上可以認(rèn)為浸遗,每個應(yīng)用程序利用mesos搭建了一個虛擬集群自己使用猫胁。
細(xì)粒度模式(Fine-grained Mode):鑒于粗粒度模式會造成大量資源浪費,Spark On Mesos還提供了另外一種調(diào)度模式:細(xì)粒度模式跛锌,這種模式類似于現(xiàn)在的云計算弃秆,思想是按需分配。與粗粒度模式一樣髓帽,應(yīng)用程序啟動時菠赚,先會啟動executor,但每個executor占用資源僅僅是自己運行所需的資源氢卡,不需要考慮將來要運行的任務(wù)锈至,之后晨缴,mesos會為每個executor動態(tài)分配資源译秦,每分配一些,便可以運行一個新任務(wù)击碗,單個Task運行完之后可以馬上釋放對應(yīng)的資源筑悴。每個Task會匯報狀態(tài)給Mesos slave和Mesos Master,便于更加細(xì)粒度管理和容錯稍途,這種調(diào)度模式類似于MapReduce調(diào)度模式阁吝,每個Task完全獨立,優(yōu)點是便于資源控制和隔離械拍,但缺點也很明顯突勇,短作業(yè)運行延遲大。
關(guān)于driver
首先不知道這個main函數(shù)指的是什么坷虑,是像C語言中的main函數(shù)一樣嗎甲馋,其次看到那句create context讓我想到的是源碼中有一段代碼在某個場合創(chuàng)建了一個driver然后在driver里面創(chuàng)建的context,但看了兩天的代碼以后迄损,發(fā)并沒有找到定躏。思考了很久以后才明白driver是什么意思:
用戶提交的應(yīng)用程序代碼在spark中運行起來就是一個driver,用戶提交的程序運行起來就是一個driver,他是一個一段特殊的excutor進(jìn)程痊远,這個進(jìn)程除了一般excutor都具有的運行環(huán)境外垮抗,這個進(jìn)程里面運行著DAGscheduler Tasksheduler Schedulerbackedn等組件。
這段計算π值的程序代碼在spark上運行起來就是一個driver碧聪,可以看到這段程序里有個main函數(shù)冒版,它是整個應(yīng)用程序的開始,也可以看到在這段代碼中創(chuàng)建了context逞姿,這樣與官網(wǎng)給的解釋就完全對上了壤玫。
Q:一個應(yīng)用程序是如何與一個driver一一對應(yīng)的呢,在worker.scala中我們找到了創(chuàng)建driver的代碼哼凯,一步步往上追溯就能發(fā)現(xiàn)一個Driver如何與一個應(yīng)用程序一一對應(yīng)起來的
(二)driver做什么
運行應(yīng)用程序的main函數(shù)
- 創(chuàng)建spark的上下文
- 劃分RDD并生成有向無環(huán)圖(DAGScheduler)
- 與spark中的其他組進(jìn)行協(xié)調(diào)欲间,協(xié)調(diào)資源等等(SchedulerBackend)
- 生成并發(fā)送task到executor(taskScheduler)
(三)driver運行在哪里(在這里只討論yarn模式)
官網(wǎng)上說:There are two deploy modes that can be used to launch Spark application on Yarn.In cluster mode,the Spark driver run inside an application master process.And in the client mode,the driver runs in the client process.
yarn-cluster模式下,client將用戶程序提交到到spark集群中就與spark集群斷開聯(lián)系了断部,此時client將不會發(fā)揮其他任何作用猎贴,僅僅負(fù)責(zé)提交。在此模式下蝴光。AM和driver是同一個東西她渴,但官網(wǎng)上給的是driver運行在AM里,可以理解為AM包括了driver的功能就像Driver運行在AM里一樣蔑祟,此時的AM既能夠向AM申請資源并進(jìn)行分配趁耗,又能完成driver劃分RDD提交task等工作
yarn-client模式下
yarn-client模式下,Driver運行在客戶端上疆虚,先有driver再用AM苛败,此時driver負(fù)責(zé)RDD生成、task生成和分發(fā)径簿,向AM申請資源等 ,AM負(fù)責(zé)向RM申請資源罢屈,其他的都由driver來完成
總結(jié)
用戶提交的程序運行起來就是一個driver,他是一個一段特殊的excutor進(jìn)程篇亭,這個進(jìn)程除了一般excutor都具有的運行環(huán)境外缠捌,這個進(jìn)程里面運行著DAGscheduler Tasksheduler Schedulerbackedn等組件
yarn-Cluster模式下driver運行在AM里,這個AM既完成劃分RDD生成有向無環(huán)圖提交task等任務(wù)也負(fù)責(zé)管理與這個application運行有關(guān)的executor
yarn-Client模式下由AM負(fù)責(zé)管理excutor其余的由driver完成