Spark資源排程分配原理
一、任務排程和資源排程的區別
1.任務排程是通過DAGScheduler、TaskScheduler、SchedulerBackend等進行的作業排程
2.資源排程是指應用程式如何獲得資源
3.任務排程是在資源排程的基礎上進行的,沒有資源就沒有任務
二、資源排程原理
1.因為Master負責資源管理和排程,所以資源排程的方法shedule位於Master.scala這個類中,當註冊程式或者資源發生改變時都會導致schedule的呼叫,例如註冊程式的時候
2.Schedule呼叫的時機:每次有新的應用程式提交或者資源狀況或者叢集資源狀況發生改變的時候,包括Executor增加或者減少、worker增加或者減少。
3.當前Master必須是alive的方式,才能進行資源的排程;如果不是alive的狀態會直接返回。
4.使用Random.shuffle把Master中保留的叢集中所有worker的資訊隨機打亂,其演算法內部是迴圈隨機交換
5.判斷所有worker中那些事alive級別的worker,alive才能夠參與資源的分配工作。
6.當SparkSubmit指定Driver在Cluster模式的情況下,此時Driver會加入waitingDriver等待列表中,在每個DriverInfo的DriverDescription中有要啟動Driver時候對worker的記憶體及Cores的要求等內容。
在符資源要求的情況下采用隨機打亂後的一個worker來啟動Driver。
Master發指令給worker,讓遠端的worker啟動Driver。
7.先啟動Driver才會發生後續的一切資源排程的模式
8.Spark預設為應用程式啟動Executor的方式是FIFO的方式,也就是說所有提交的應用程式都是放在排程的等待佇列中的,先進先出,只有滿足了前面應用程式的資源分配的基礎上才能夠滿足下一個應用程式資源的分配。
9.為應用程式具體分配Executor之前要判斷應用程式是否還需要分配Core,如果不需要則不會為應用程式分配Executor。
10.具體分配Executor之前要對要求worker必須是alive的狀態且必須滿足Application每個Executor的記憶體和Cores的要求,並且在此基礎上進行排序產生計算資源由大到小的usableWorkers資料結構。
在FIFO的情況下預設是spreadOutApps來讓應用程式儘可能多的執行在所有的Node上:
11.為應用程式分配Executors有兩種方式:
(1)儘可能在叢集中的所有worker上分配Executor,這種方式往往會帶來潛在的更好的資料本地性(此時沒有考慮資料本地性,只是為了更好的併發)
(2)
12.具體在叢集上分配Cores的時候會盡可能的滿足我們的要求
13.如果是每個worker下面只能夠為當前的應用程式分配一個Executor的話,每次是分配一個Core!
14.準備具體要為當前應用程式分配的Executor資訊後,Master要通過遠端通訊發指令給worker來具體啟動ExecutorBackend程序
15.緊接著給Driver傳送一個ExecutorAdded的資訊。