1.啟動(dòng)Spark集群
2.執(zhí)行jar包
3.啟動(dòng)了Driver進(jìn)程(通過(guò)執(zhí)行代碼啟動(dòng)了Driver) 然后生成了兩個(gè)對(duì)象DSGSchedule TASKSchedule
4.當(dāng)TaskSchedule創(chuàng)建完成之后向master發(fā)送一個(gè)請(qǐng)求:為當(dāng)前的Application申請(qǐng)資源。申請(qǐng)多少資源是有默認(rèn)值的耿戚,或者配置值如下
5.Master接受了資源請(qǐng)求后窄坦,根據(jù)自己所管理的資源情況,會(huì)通知資源充足的Worker節(jié)點(diǎn)上啟動(dòng)Executor進(jìn)程
6.Master向worker發(fā)送消息:在你的節(jié)點(diǎn)上啟動(dòng)Executor 啟動(dòng)什么樣子的Executor也在這個(gè)消息里告訴(此時(shí)所有的Executor全部啟動(dòng)起來(lái))
7.每一個(gè)Executor進(jìn)程啟動(dòng)完畢后都會(huì)反向注冊(cè)給TASKSchedule(當(dāng)?shù)?步完事兒后 TaskSchedule就有一批Executor地址)
(3.4.5.6.7是第二行代碼觸發(fā)的)
8.(然后第三行代碼)當(dāng)遇到count算子時(shí)候會(huì)觸發(fā)job的執(zhí)行媚媒,DAGSchedule根據(jù)RDD寬窄依賴切割job,劃分stage,stage內(nèi)部的rdd一定是窄以來(lái)榆纽,stage與stage之間是寬依賴蒿叠,切割完畢后DAGSchedule會(huì)將這個(gè)stage中所有的task封裝到taskSet對(duì)象中然后發(fā)送給TaskSchedule。(發(fā)送指的是DAGSchedule調(diào)用了TaskSchedule的一個(gè)submittask方法)
9.taskSchedule接受到每一個(gè)TaskSet對(duì)象后券册,都會(huì)遍歷這個(gè)TaskSet集合频轿,將集合中每一個(gè)task發(fā)送到Executor中執(zhí)行。
補(bǔ)充 TaskSchedule 在發(fā)送每一個(gè)task之前烁焙,首先要看一下要計(jì)算數(shù)據(jù)的位置航邢。
Spark可以復(fù)用資源(Executor)這是由于Spark粗粒度資源調(diào)度導(dǎo)致
而MR這種細(xì)粒度資源調(diào)度計(jì)算框架,只要上一個(gè)Action算子執(zhí)行完畢后啟動(dòng)的Executor會(huì)被kill掉考阱。
注意:如果想讓你的Application分布式計(jì)算翠忠,那么你的代碼中就不要設(shè)置conf,setMsater為local,干脆不用設(shè)置
并且在提交Application的時(shí)候要指定--master這個(gè)選項(xiàng)以及選項(xiàng)參數(shù)(spark://hadoop1:7077)