EventScheduler
:將系統中的可用資源均勻地分配給須要資源的topology,其實也不是絕對均勻,後續會詳細說明DefaultScheduler
:和EvenetScheduler差很少,只不過會先將其它topology不須要的資源從新收集起來,再進行EventSchedulerIsolationScheduler
:用戶可定義這個topology的機器資源,storm分配的時候會優先分配這些topology,以保證分配給該topology的機器只爲這一個topology服務needsSchedualerTopologies
方法得到須要進行任務分配的topologiesgetAvailableSlots
方法得到當前集羣可用的資源,以<node,port>
集合的形式返回,賦值給available-slots
<start-t ask-id,end-task-id>
集合存入all-executors
,根據topology計算executors信息,採用compute-executors
算法,稍後會講解get-alive-assigned-node+port->executors
方法得到該topology已經得到的資源,返回<node+port,executor>
集合的形式存入alive-assigned
,爲何要計算當前topology的已分配資源狀況而不是計算集羣中全部已分配資源?,猜想多是進行任務rebalance的時候會有用吧。slot-can-reassign
對alive-assigned中的slots信息進行判斷,選出其中能被從新分配的slot存入變量can-reassigned
available-slots
和can-reassigned
兩部分組成total-slots--to-use
:min(topology的NumWorker數,available-slots
+can-reassigned
)total-slots--to-use
>當前已分配的slots數目,則調用bad-slots
方法計算可被釋放的slotfreeSlots
方法釋放計算出來的bad-slotschedule-topologies-evenly
進行分配主要流程梳理
:得到當前集羣空閒資源->計算當前topology的executor信息(分配時會用得上)->計算可從新分配和可釋放的資源->分配node
EventScheduler調度算法與Default相比少了一個計算可從新分配資源的環節,直接利用Supervisor中空閒的slot進行分配,在此再也不細講。算法
這兩種調度機制在通常狀況下調度結果基本保持一致,因此一塊兒來看:spa
集羣初始狀態code
接下來咱們提交3個topologyorm
Topologyblog |
Worker數ci |
Executer數資源 |
Task數get |
T-1博客 |
3 |
8 |
16 |
T-2 |
5 |
10 |
10 |
T-3 |
3 |
5 |
10 |
注:格式爲[start-task-id end-task-id],共8個worker,第一個包含2個task,start-task-id爲1,end-task-id爲2,因此記爲[1 2],後面依次類推...compute-executors算法會在下一篇博客中詳解
分配後集羣狀態爲:
分配後集羣狀態爲:
分配後集羣狀態爲:
如圖,此任務調度方式也不是絕對均勻的,s1已經滿負荷運轉,而s4纔剛使用一個slots。
comput-executors、sort-slots、slots-can-reassign、bad-slots、sort-slots等
會在下篇博客中專門探討