小編給大家分享一下spark基本工作流程是怎么樣的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
運(yùn)河網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),運(yùn)河網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為運(yùn)河上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個(gè)售后服務(wù)好的運(yùn)河做網(wǎng)站的公司定做!
引言
Spark的應(yīng)用分為任務(wù)調(diào)度和任務(wù)執(zhí)行兩個(gè)部分,所有的Spark應(yīng)用程序都離不開SparkContext和Executor兩部分,Executor負(fù)責(zé)執(zhí)行任務(wù),運(yùn)行Executor的機(jī)器稱為Worker節(jié)點(diǎn),SparkContext由用戶程序啟動(dòng),通過資源調(diào)度模塊和Executor通信。
具體來說,以SparkContext為程序運(yùn)行的總?cè)肟?,在SparkContext的初始化過程中,Spark會(huì)分別創(chuàng)建DAGScheduler作業(yè)調(diào)度和TaskScheduler任務(wù)調(diào)度兩級(jí)調(diào)度模塊。
其中作業(yè)調(diào)度模塊是基于任務(wù)階段的高層調(diào)度模塊,它為每個(gè)Spark作業(yè)計(jì)算具有依賴關(guān)系的多個(gè)調(diào)度階段(通常根據(jù)shuffle來劃分),然后為每個(gè)階段構(gòu)建出一組具體的任務(wù)(通常會(huì)考慮數(shù)據(jù)的本地性等),然后以TaskSets(任務(wù)組)的形式提交給任務(wù)調(diào)度模塊來具體執(zhí)行。而任務(wù)調(diào)度模塊則負(fù)責(zé)具體啟動(dòng)任務(wù)、監(jiān)控和匯報(bào)任務(wù)運(yùn)行情況。
spark應(yīng)用程序的運(yùn)行架構(gòu):
(1)簡單的說:
由driver向集群申請資源,集群分配資源,啟動(dòng)executor。driver將spark應(yīng)用程序的代碼和文件傳送給executor。executor上運(yùn)行task,運(yùn)行完之后將結(jié)果返回給driver或者寫入外界。
(2)復(fù)雜點(diǎn)說:
提交應(yīng)用程序,構(gòu)建sparkContext,構(gòu)建DAG圖,提交給scheduler進(jìn)行解析,解析成一個(gè)個(gè)stage,提交給集群,由集群任務(wù)管理器進(jìn)行調(diào)度,集群啟動(dòng)spark executor。driver把代碼和文件傳給executor。executor進(jìn)行各種運(yùn)算完成task任務(wù)。driver上的block tracker記錄executor在各個(gè)節(jié)點(diǎn)上產(chǎn)生的數(shù)據(jù)塊。task運(yùn)行完之后,將數(shù)據(jù)寫入HDFS上或者其他類型數(shù)據(jù)庫里。
(3)全面點(diǎn)說:
spark應(yīng)用程序進(jìn)行各種transformation的計(jì)算,最后通過action觸發(fā)job。提交之后首先通過sparkContext根據(jù)RDD的依賴關(guān)系構(gòu)建DAG圖,DAG圖提交給DAGScheduler進(jìn)行解析,解析時(shí)是以shuffle為邊界,反向解析,構(gòu)建stage,stage之間也有依賴關(guān)系。這個(gè)過程就是對DAG圖進(jìn)行解析劃分stage,并且計(jì)算出各個(gè)stage之間的依賴關(guān)系。然后將一個(gè)個(gè)TaskSet提交給底層調(diào)度器,在spark中是提交給taskScheduler處理,生成TaskSet manager,最后提交給executor進(jìn)行計(jì)算,executor多線程計(jì)算,計(jì)算完反饋給TaskSetmanager,再反饋給taskScheduler,然后再反饋回DAGScheduler。全部運(yùn)行完之后寫入數(shù)據(jù)。
(4)更加深入理解:
應(yīng)用程序提交后,觸發(fā)action,構(gòu)建sparkContext,構(gòu)建DAG圖,提交給DAGScheduler,構(gòu)建stage,以stageSet方式提交給TaskScheduler,構(gòu)建taskSet Manager,然后將task提交給executor運(yùn)行。executor運(yùn)行完task后,將完成信息提交給schedulerBackend,由它將任務(wù)完成的信息提交給TaskScheduler。TaskScheduler反饋信息給TaskSetManager,刪除該task任務(wù),執(zhí)行下一個(gè)任務(wù)。同時(shí)TaskScheduler將完成的結(jié)果插入到成功隊(duì)列里,加入之后返回加入成功的信息。TaskScheduler將任務(wù)處理成功的信息傳給TaskSet Manager。全部任務(wù)完成后TaskSet Manager將結(jié)果反饋給DAGScheduler。如果屬于resultTask,交給JobListener。如果不屬于resultTask,保存結(jié)果。
spark作業(yè)提交到執(zhí)行
SparkContext通過DAGScheduler的runJob提交作業(yè)。然后DAGScheduler將Job劃分為Stage,Spark根據(jù)RDD的依賴關(guān)系劃分Stage,最終將其封裝成taskset進(jìn)行提交。TaskScheduler類負(fù)責(zé)任務(wù)調(diào)度資源的分配,SchedulerBackend負(fù)責(zé)與Master、Worker通信收集Worker上分配給該應(yīng)用使用的資源情況。executor負(fù)責(zé)具體的任務(wù)執(zhí)行。
Driver的任務(wù)提交過程
1、Driver程序的代碼運(yùn)行到action操作,觸發(fā)了SparkContext的runJob方法。
2、SparkContext調(diào)用DAGScheduler的runJob函數(shù)。
3、DAGScheduler把Job劃分stage,然后把stage轉(zhuǎn)化為相應(yīng)的Tasks,把Tasks交給TaskScheduler。
4、通過TaskScheduler把Tasks添加到任務(wù)隊(duì)列當(dāng)中,交給SchedulerBackend進(jìn)行資源分配和任務(wù)調(diào)度。
5、調(diào)度器給Task分配執(zhí)行Executor,ExecutorBackend負(fù)責(zé)執(zhí)行Task。
以上是“spark基本工作流程是怎么樣的”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!