1. 程式人生 > >Spark資源排程和任務排程

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

負責重試,將task重新發送給Executor去執行,預設重試3次。如果重試3次依然失敗,那麼這個task所在的stage就失敗了。

             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的執行就相應的變慢了。