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