storm源碼閱讀筆記之任務調度算法

3種Scheduler概述

  • EventScheduler:將系統中的可用資源均勻地分配給須要資源的topology,其實也不是絕對均勻,後續會詳細說明
  • DefaultScheduler:和EvenetScheduler差很少,只不過會先將其它topology不須要的資源從新收集起來,再進行EventScheduler
  • IsolationScheduler:用戶可定義這個topology的機器資源,storm分配的時候會優先分配這些topology,以保證分配給該topology的機器只爲這一個topology服務

DefaultScheduler

  • 調用cluster的needsSchedualerTopologies方法得到須要進行任務分配的topologies
  • 開始分別對每個topology進行處理
    • 調用cluster的getAvailableSlots方法得到當前集羣可用的資源,以<node,port>集合的形式返回,賦值給available-slots
    • 得到當前topology的executor信息並轉化爲<start-t ask-id,end-task-id>集合存入all-executors,根據topology計算executors信息,採用compute-executors算法,稍後會講解
    • 而後調用EventScheduler的get-alive-assigned-node+port->executors方法得到該topology已經得到的資源,返回<node+port,executor>集合的形式存入alive-assigned,爲何要計算當前topology的已分配資源狀況而不是計算集羣中全部已分配資源?,猜想多是進行任務rebalance的時候會有用吧。
    • 接着就調用slot-can-reassign對alive-assigned中的slots信息進行判斷,選出其中能被從新分配的slot存入變量can-reassigned
    • 這樣可用的資源就由available-slotscan-reassigned兩部分組成
    • 接下來計算當前topology能使用的所有slot數目total-slots--to-use:min(topology的NumWorker數,available-slots+can-reassigned)
    • 若是total-slots--to-use>當前已分配的slots數目,則調用bad-slots方法計算可被釋放的slot
    • 調用cluster的freeSlots方法釋放計算出來的bad-slot
    • 最後調用EventScheduler的schedule-topologies-evenly進行分配
    • 繼續下一個topology

主要流程梳理:得到當前集羣空閒資源->計算當前topology的executor信息(分配時會用得上)->計算可從新分配和可釋放的資源->分配node

EventScheduler

EventScheduler調度算法與Default相比少了一個計算可從新分配資源的環節,直接利用Supervisor中空閒的slot進行分配,在此再也不細講。算法

EventScheduler和DefaultScheduler調度舉例:

這兩種調度機制在通常狀況下調度結果基本保持一致,因此一塊兒來看:spa

集羣初始狀態code

接下來咱們提交3個topologyorm

Topologyblog

Workerci

Executer資源

Taskget

T-1博客

3

8

16

T-2

5

10

10

T-3

3

5

10

一、提交T-1

  • sort-slots算法對可用slots進行處理,結果爲{[s1 6700] [s2 6700] [s3 6700] [s4 6700] [s1 6701] [s2 6701] [s3 6701] [s4 6701] [s1 6702] [s2 6702] [s3 6702] [s4 6702] [s1 6703] [s2 6703] [s3 6703] [s4 6703]}
  • compute-executors算法計算後獲得的Executor列表爲:{[1 2] [3 4] [5 6] [7 8] [9 10] [11 12] [13 14] [15 16]};注:格式爲[start-task-id end-task-id],共8個worker,第一個包含2個task,start-task-id爲1,end-task-id爲2,因此記爲[1 2],後面依次類推...compute-executors算法會在下一篇博客中詳解
  • 8個Executor在3個worker上的分佈狀態爲[3,3,2]
  • 分配結果爲:
    • {[1 2] [3 4] [5 6]} -> [s1 6700]
    • {[7 8] [9 10] [11 12]} -> [s2 6700]
    • {[13 14] [15 16]} -> [s3 6700]

分配後集羣狀態爲:

二、提交T-2

  • 可用的slot通過sort-slots後:{[s1 6701] [s2 6701] [s3 6701] [s4 6700] [s1 6702] [s2 6702] [s3 6702] [s4 6701] [s1 6703] [s2 6703] [s3 6703] [s4 6702] [s4 6703]}
  • comput-executors計算後獲得的executor列表:{[1 1] [2 2] [3 3] [4 4] [5 5] [6 6] [7 7] [8 8] [9 9] [10 10]}
  • 10個executor在5個worker上的分佈爲[2,2,2,2,2]
  • 分配結果爲:
    • {[1 1] [2 2]} -> [s1 6701]
    • {[3 3] [4 4]} -> [s2 6701]
    • {[5 5] [6 6]} -> [s3 6701]
    • {[7 7] [8 8]} -> [s4 6700]
    • {[9 9] [10 10]} -> [s1 6702]

分配後集羣狀態爲:

三、提交T-3

  • sort-slots後slot列表爲:{[s1 6703] [s2 6702] [s3 6702] [s4 6701] [s2 6703] [s3 6703] [s4 6702] [s2 6704] [s3 6704] [s4 6703] [s4 6704]}
  • compute-executors後獲得的executor列表爲:{[1 2] [3 4] [5 6] [7 8] [9 10]}
  • 5個executor在3個worker上的分佈爲:[2,2,1]
  • 分配結果爲:
    • {[1 2] [3 4]} -> [s1 6703]
    • {[5 6] [7 8]} -> [s2 6702]
    • [9 10] -> [s3 6702]

分配後集羣狀態爲:

如圖,此任務調度方式也不是絕對均勻的,s1已經滿負荷運轉,而s4纔剛使用一個slots。

此篇用到的算法如comput-executors、sort-slots、slots-can-reassign、bad-slots、sort-slots等會在下篇博客中專門探討

相關文章
相關標籤/搜索