Spark任務(wù)處理流程 - thomas0yang的專(zhuān)欄 - 博客頻道 - CSDN.NET http://blog.csdn.net/thomas0yang/article/details/50352261
最近學(xué)習(xí)了Spark铣鹏,其資源和任務(wù)調(diào)度方式的思想跟Yarn很像,現(xiàn)根據(jù)任務(wù)提交分析處理過(guò)程總結(jié)一下相關(guān)的主要模塊和處理流程葵第。
一些重要術(shù)語(yǔ)`
client合溺,用戶(hù)編寫(xiě)的spark任務(wù)提交程序
master,spark主節(jié)點(diǎn)棠赛,負(fù)責(zé)任務(wù)和資源調(diào)度睛约、節(jié)點(diǎn)管理,類(lèi)似于Yarn的ResourceManager
worker辩涝,spark工作節(jié)點(diǎn),可以在上面啟動(dòng)Executor進(jìn)程捉邢,類(lèi)似于Yarn的NodeManager
driver商膊,worker上的一進(jìn)程,負(fù)責(zé)任務(wù)內(nèi)部的分解執(zhí)行等藐翎,類(lèi)似于Yarn的ApplicationMaster
Application实幕,用戶(hù)在spark上構(gòu)建的程序,包含了driver程序以及集群上的executors
Job茬缩,包含很多task的并行計(jì)算凰锡,可以認(rèn)為是Spark RDD 里面的action,每個(gè)action的計(jì)算會(huì)生成一個(gè)job圈暗。用戶(hù)提交的Job會(huì)提交給DAGScheduler裕膀,Job會(huì)被分解成Stage和Task
Stage一個(gè)Job會(huì)被拆分為多組Task,每組任務(wù)被稱(chēng)為一個(gè)Stage就像Map Stage昼扛, Reduce Stage。 Stage的劃分在RDD的論文中有詳細(xì)的介紹渺鹦,簡(jiǎn)單的說(shuō)是以shuffle和result這兩種類(lèi)型來(lái)劃分蛹含。在Spark中有兩類(lèi)task,一類(lèi)是shuffleMapTask吸耿,一類(lèi)是resultTask酷窥,第一類(lèi)task的輸出是shuffle所需數(shù)據(jù)矾踱,第二類(lèi)task的輸出是result砸脊,stage的劃分也以此為依據(jù)拳氢,shuffle之前的所有變換是一個(gè)stage蛋铆,shuffle之后的操作是另一個(gè)stage。比如 rdd.parallize(1 to 10).foreach(println) 這個(gè)操作沒(méi)有shuffle留特,直接就輸出了玛瘸,那么只有它的task是resultTask,stage也只有一個(gè)右核;如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 這個(gè)job因?yàn)橛衦educe渺绒,所以有一個(gè)shuffle過(guò)程菱鸥,那么reduceByKey之前的是一個(gè)stage躏鱼,執(zhí)行shuffleMapTask,輸出shuffle所需的數(shù)據(jù)鹊漠,reduceByKey到最后是一個(gè)stage茶行,直接就輸出結(jié)果了。如果job中有多次shuffle拢军,那么每個(gè)shuffle之前都是一個(gè)stage茉唉。
Task,被送到executor上的工作單元度陆。Spark上分為2類(lèi)task,shuffleMapTask和 resultTask
處理流程
集群初始化
啟動(dòng)master趾诗,執(zhí)行master的main函數(shù)蹬蚁,初始化master的基本信息,等待任務(wù)處理贝乎,如相應(yīng)worker注冊(cè)叽粹,納入集群管理
啟動(dòng)worker,創(chuàng)建Actor锤灿、創(chuàng)建本地目錄辆脸、注冊(cè)Worker
任務(wù)提交
spark-submit提交最終調(diào)用client類(lèi)(standalone),向master請(qǐng)求requestSubmitJob
master響應(yīng)状囱,1創(chuàng)建driver、加入待分配driver隊(duì)列2調(diào)度schedule 調(diào)度方法浪箭,schedule(): 1、從waitDrivers中分配driver,執(zhí)行driver中的用戶(hù)程序(FIFO) 2匹表、給waitApps分配exectors(spreadout) 3宣鄙、launchExectors
某個(gè)符合要求(cores、mem)的worker節(jié)點(diǎn)被選中作為driver苇羡,執(zhí)行用戶(hù)程序命令
用戶(hù)命令new SparkContext(), 創(chuàng)建DAGScheduler鼻弧、TaskScheduler、SparkDeploySchedulerBackend等叉存,backend創(chuàng)建了AppClient度帮,向master提交registerApplication請(qǐng)求
master響應(yīng),registerApplication:1app加入待處理隊(duì)列waitApps 2調(diào)度schedule
調(diào)度方法執(zhí)行l(wèi)aunchExectors瞳秽,worker上啟動(dòng)executor率翅,準(zhǔn)備執(zhí)行任務(wù)
用戶(hù)命令rdd.action,調(diào)用DAG進(jìn)行任務(wù)分解為stage,在分解為tasks痰洒,TaskScheduler提交Task浴韭,backend.LaunchTask(serialiedTask)
worker上的executor線(xiàn)程池執(zhí)行task脯宿,返回結(jié)果。1\shuffleMapTask,返回MapStatus2\ResultTask,返回directResult
通知driver榴芳,處理task完成,DAG.handleTaskComplet,1窟感、Mapstatus,存放在MapoutputTrackerMaster中柿祈,供以后查詢(xún)使用2、DriectResult,則所有結(jié)果在Driver合并躏嚎,輸出結(jié)果
程序結(jié)束,通知Master節(jié)點(diǎn)finishApplication
master節(jié)點(diǎn)重荠,finishApplication:removeApp虚茶、釋放回收executer等空間
以上過(guò)程是一個(gè)任務(wù)提交的主要處理流程,明細(xì)如RDD之間的依賴(lài)荞彼、計(jì)算待笑、shuffle、存儲(chǔ)等處理等請(qǐng)自行參照Spark源碼寞缝。關(guān)系圖總結(jié)如下:
參考文章: http://spark.apache.org/docs/latest/index.html https://github.com/JerryLead/SparkInternals http://jerryshao.me/architecture/2013/04/21/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B-scheduler%E6%A8%A1%E5%9D%97/ http://jerryshao.me/architecture/2013/03/29/spark-overview/ http://www.cnblogs.com/cenyuhai/tag/Spark%E6%BA%90%E7%A0%81%E7%B3%BB%E5%88%97/