Spark任務調度流程

image.png

1.啟動Spark集群

2.執行jar包

3.啟動了Driver進程(通過執行代碼啟動了Driver) 然后生成了兩個對象DSGSchedule TASKSchedule

4.當TaskSchedule創建完成之后向master發送一個請求:為當前的Application申請資源。申請多少資源是有默認值的,或者配置值如下

image.png

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容