
1.啟動Spark集群
2.執(zhí)行jar包
3.啟動了Driver進程(通過執(zhí)行代碼啟動了Driver) 然后生成了兩個對象DSGSchedule TASKSchedule
4.當TaskSchedule創(chuàng)建完成之后向master發(fā)送一個請求:為當前的Application申請資源。申請多少資源是有默認值的,或者配置值如下

5.Master接受了資源請求后,根據(jù)自己所管理的資源情況,會通知資源充足的Worker節(jié)點上啟動Executor進程
6.Master向worker發(fā)送消息:在你的節(jié)點上啟動Executor 啟動什么樣子的Executor也在這個消息里告訴(此時所有的Executor全部啟動起來)
7.每一個Executor進程啟動完畢后都會反向注冊給TASKSchedule(當?shù)?步完事兒后 TaskSchedule就有一批Executor地址)
(3.4.5.6.7是第二行代碼觸發(fā)的)
8.(然后第三行代碼)當遇到count算子時候會觸發(fā)job的執(zhí)行,DAGSchedule根據(jù)RDD寬窄依賴切割job,劃分stage,stage內(nèi)部的rdd一定是窄以來,stage與stage之間是寬依賴,切割完畢后DAGSchedule會將這個stage中所有的task封裝到taskSet對象中然后發(fā)送給TaskSchedule。(發(fā)送指的是DAGSchedule調(diào)用了TaskSchedule的一個submittask方法)
9.taskSchedule接受到每一個TaskSet對象后,都會遍歷這個TaskSet集合,將集合中每一個task發(fā)送到Executor中執(zhí)行。
補充 TaskSchedule 在發(fā)送每一個task之前,首先要看一下要計算數(shù)據(jù)的位置。
Spark可以復用資源(Executor)這是由于Spark粗粒度資源調(diào)度導致
而MR這種細粒度資源調(diào)度計算框架,只要上一個Action算子執(zhí)行完畢后啟動的Executor會被kill掉。
注意:如果想讓你的Application分布式計算,那么你的代碼中就不要設(shè)置conf,setMsater為local,干脆不用設(shè)置
并且在提交Application的時候要指定--master這個選項以及選項參數(shù)(spark://hadoop1:7077)