Scheduler是storm的調度器,負責爲topology分配當前集羣中可用的資源。Storm分別提供了3中調度器:orm
- EvenScheduler:會將系統中的可用資源均勻地分配給當前須要任務分配的多個topology。
- DefaultScheduler:跟EvenScheduler基本上同樣,惟一區別在於它在爲topology分配任務以前先釋放掉其餘Topology再也不須要的資源,而後調用EvenScheduler方法爲topology均勻分配資源。
- IsolationScheduler:它有比較特殊的機制,使得用戶能夠單獨爲某些topology指定它們須要的機器資源(機器數)。用戶須要在storm配置項中指定這些信息,IsolationScheduler會優先對這些Topology分配任務,保證分配給某個topology的機器只能運行這個特定的topology,也就是說這些topology的運行環境是相互獨立的。
這三個調度器是用clojure寫的,先忽略掉,等待後面分析源碼部分再寫。blog
先來舉一個實際例子,看一下storm的調度過程,相信你們一看都能明白。資源
【場景】假設當前集羣中有6臺機器,每臺機器上可用端口均爲6700、670一、670二、6703,而且當前急羣中沒有正在運行的topology,初始狀態如如所示:源碼
下表是咱們依次要提交的3個topology:io
Topology |
Worker數目 |
Executor數目 |
Task數目 |
T-1 |
3 |
8 |
16 |
T-2 |
5 |
10 |
10 |
T-3 |
8 |
16 |
16 |
正常狀況下,EvenScheduler和DefaultScheduler的調度結果是一致的,這兩個能夠放在一塊兒。看看會通過以下階段:table
一、提交T-1集羣
- 可用的slot列表通過sort-slots方法處理後的結果是:{[S1,6700][S2,6700][S3,6700][S4,6700][S5,6700][S6,6700][S1,6701][S2,6701][S3,6701][S4,6701][S5,6701][S6,6701][S1,6702][S2,6702][S3,6702][S4,6702][S5,6702][S6,6702][S1,6703][S2,6703][S3,6703][S4,6703][S5,6703][S6,6703]}
- compute-executors方法計算完後獲得的Executor列表爲:{[1,2][3,4][5,6][7,8][9,10][11,12][13,14][15,16]}(假設TaskList爲天然序數)
- 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-2List
- 可用的slot列表通過sort-slots方法處理後的結果是:{[S1,6701][S2,6701][S3,6701][S4,6700][S5,6700][S6,6700][S4,6701][S5,6701][S6,6701][S1,6702][S2,6702][S3,6702][S4,6702][S5,6702][S6,6702][S1,6703][S2,6703][S3,6703][S4,6703][S5,6703][S6,6703]}
- compute-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]} ->[S5,6700]
此時集羣中的任務分配狀況以下:clojure
三、提交T-3
- 可用的slot列表通過sort-slots方法處理後的結果是:{[S1,6702][S2,6702][S3,6702][S4,6701][S5,6701][S6,6700][S1,6703][S2,6703][S3,6703][S4,6702][S5,6702][S6,6701][S4,6703][S5,6703][S6,6702][S6,6703]}
- compute-executors方法計算完後獲得的Executor列表爲:{[1,1][2,2][3,3][4,4][5,5][6,6][7,7][8,8][9,9][10,10][11,11][12,12][13,13][14,14][15,15][16,16]}