Spark資源排程和任務排程
轉自:https://blog.csdn.net/lhworldblog/article/details/79300025
一、前述
Spark的資源排程是個很重要的模組,只要搞懂原理,才能具體明白Spark是怎麼執行的,所以尤其重要。
自願申請的話,本文分粗粒度和細粒度模式分別介紹。
二、具體
-
Spark資源排程流程圖:
-
Spark資源排程和任務排程的流程:
1、啟動集群后,Worker節點會向Master節點彙報資源情況,Master掌握了叢集資源情況。
2、當Spark提交一個Application後,根據RDD之間的依賴關係將Application形成一個DAG有向無環圖。任務提交後,Spark會在Driver端建立兩個物件:DAGScheduler和TaskScheduler。
3、DAGScheduler是任務排程的高層排程器,是一個物件。DAGScheduler的主要作用就是將DAG根據RDD之間的寬窄依賴關係劃分為一個個的Stage,然後將這些Stage以TaskSet的形式提交給TaskScheduler(TaskScheduler是任務排程的低層排程器,這裡TaskSet其實就是一個集合,裡面封裝的就是一個個的task任務,也就是stage中的並行度task任務)
4、TaskSchedule會遍歷TaskSet集合,拿到每個task後會將task傳送到計算節點Executor中去執行(其實就是傳送到Executor中的執行緒池ThreadPool去執行)。
5、task在Executor執行緒池中的執行情況會向TaskScheduler反饋,
6、當task執行失敗時,則由TaskScheduler
7、stage失敗了則由DAGScheduler來負責重試,重新發送TaskSet到TaskSchdeuler,Stage預設重試4次。如果重試4次以後依然失敗,那麼這個job就失敗了。job失敗了,Application就失敗了。
8、TaskScheduler不僅能重試失敗的task,還會重試straggling(落後,緩慢)task(也就是執行速度比其他task慢太多的task)。如果有執行緩慢的task那麼TaskScheduler會啟動一個新的task來與這個執行緩慢的task執行相同的處理邏輯。兩個task哪個先執行完,就以哪個task的執行結果為準。這就是Spark的推測執行機制。在Spark中推測執行預設是關閉的。推測執行可以通過spark.speculation屬性來配置。
總結:
1、對於ETL型別要入資料庫的業務要關閉推測執行機制,這樣就不會有重複的資料入庫。
2、如果遇到資料傾斜的情況,開啟推測執行則有可能導致一直會有task重新啟動處理相同的邏輯,任務可能一直處於處理不完的狀態。(所以一般關閉推測執行)
3、一個job中多個action, 就會有多個job,一般一個action對應一個job,如果一個application中有多個job時,按照順序一次執行,即使後面的失敗了,前面的執行完了就完了,不會回滾。
4、有SparkContext端就是Driver端。
5、一般到如下幾行時,資源就申請完了,後面的就是處理邏輯了
val conf = new SparkConf()
conf.setMaster("local").setAppName("pipeline");
val sc = new SparkContext(conf)
-
粗粒度資源申請和細粒度資源申請
粗粒度資源申請(Spark)
在Application執行之前,將所有的資源申請完畢,當資源申請成功後,才會進行任務的排程,當所有的task執行完成後,才會釋放這部分資源。
優點:在Application執行之前,所有的資源都申請完畢,每一個task執行時直接使用資源就可以了,不需要task執行時在執行前自己去申請資源,task啟動就快了,task執行快了,stage執行就快了,job就快了,application執行就快了。
缺點:直到最後一個task執行完成才會釋放資源,叢集的資源無法充分利用。當資料傾斜時更嚴重。
細粒度資源申請(MapReduce)
Application執行之前不需要先去申請資源,而是直接執行,讓job中的每一個task在執行前自己去申請資源,task執行完成就釋放資源。
優點:叢集的資源可以充分利用。
缺點:task自己去申請資源,task啟動變慢,Application的執行就相應的變慢了。