首先將代碼打包上傳到集群
更多大數(shù)據(jù)队萤、spark轮锥、Hadoop等學(xué)習(xí)資料可以加我微信獲取“mipi946”
1、Driver端會(huì)調(diào)用SparkSubmit類(內(nèi)部執(zhí)行submit->doRunMain->通過(guò)反射
獲取應(yīng)用程序的主類對(duì)象->執(zhí)行主類的main方法)
2要尔、構(gòu)建sparkConf和sparkContext對(duì)象舍杜,在sparkContext入口做了三件事,創(chuàng)建
了sparkEnv對(duì)象(創(chuàng)建了ActorSystem對(duì)象)TaskScheduler(用來(lái)生成并發(fā)送
task給Executor)DAGScheduler(用來(lái)劃分Stage)
3赵辕、clientActor將任務(wù)封裝到ApplicationDescription對(duì)象并且提交給Master
4既绩、Master收到任務(wù)信息后,將任務(wù)信息存到內(nèi)存中还惠,同時(shí)放到隊(duì)列中(waitingApp)
5饲握、任務(wù)信息開(kāi)始執(zhí)行后,調(diào)用schedule方法,進(jìn)行資源的調(diào)度救欧。
6衰粹、將調(diào)度好的資源封裝到LaunchExecutor并發(fā)送給對(duì)應(yīng)的worker。
7颜矿、worker接收到master發(fā)送來(lái)的任務(wù)調(diào)度信息(LaunchExecutor)寄猩,將信息封裝
成一個(gè)ExecutorRunner對(duì)象。
8骑疆、封裝成ExecutorRunner后田篇,調(diào)用ExecutorRunner的·start方法,開(kāi)始啟動(dòng)GoarseGrainedExecutorBackend對(duì)象
9箍铭、Executor啟動(dòng)后DriverActor進(jìn)行反向注冊(cè)泊柬。
10、與DriverActor注冊(cè)成功后诈火,創(chuàng)建一個(gè)線程池(TreadPool)用來(lái)執(zhí)行任務(wù)
11兽赁、當(dāng)所有的Executor注冊(cè)完成后,意味著作業(yè)環(huán)境準(zhǔn)備好了冷守,Driver端會(huì)結(jié)束與
sparkContext對(duì)象的初始化刀崖。
12、當(dāng)Driver初始化完成后(創(chuàng)建一個(gè)sc實(shí)例)會(huì)繼續(xù)執(zhí)行我們自己提交的App
代碼拍摇,當(dāng)觸發(fā)了action算子時(shí)就會(huì)觸發(fā)一個(gè)job亮钦,這時(shí)就會(huì)調(diào)用DAGScheduler對(duì)象
進(jìn)行Stage劃分。
13充活、DagScheduler開(kāi)始進(jìn)行stage劃分蜂莉。
14、將劃分好的stage按照分區(qū)生成一個(gè)一個(gè)的task混卵,并且封裝到TaskSet對(duì)象中
然后TaskSet提交到TaskScheduler
15映穗、TaskScheduler按照提交過(guò)來(lái)的TaskSet,拿到一個(gè)序列化器幕随,將TaskSet序列化
蚁滋,將序列化好的Task封裝到LaunchExecutor并且提交到DriverActor。
16合陵、DriverActor把LauchExcutor發(fā)送到Excutro上枢赔。
17、Executor接收到DriverActor發(fā)送過(guò)來(lái)的任務(wù)(LaunchExecutro)拥知,會(huì)將其封裝成為
TaskRunner踏拜,然后從線程池中獲取線程來(lái)執(zhí)行TaskRunner。
18低剔、TaskRunner拿到反序列化器速梗,反序列Taskset肮塞,然后執(zhí)行App代碼,也就是對(duì)
RDD分區(qū)上執(zhí)行的算子和自定義函數(shù)姻锁。
ClientActor:負(fù)責(zé)和Master通信枕赵,向Master注冊(cè)任務(wù)信息
DriverActor:負(fù)責(zé)和Executor進(jìn)行通信,接收到 Executor反向注冊(cè)和把任務(wù)發(fā)送到Executer位隶。