storm中的Scheduler

Scheduler是storm的調度器,負責爲topology分配當前集羣中可用的資源。Storm分別提供了3中調度器:orm

  1. EvenScheduler:會將系統中的可用資源均勻地分配給當前須要任務分配的多個topology。
  2. DefaultScheduler:跟EvenScheduler基本上同樣,惟一區別在於它在爲topology分配任務以前先釋放掉其餘Topology再也不須要的資源,而後調用EvenScheduler方法爲topology均勻分配資源。
  3. 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. {[1,2][3,4][5,6]} ->[S1,6700]
  2. {[7,8][9,10][11,12]} ->[S2,6700]
  3. {[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,1][2,2]} ->[S1,6701]
  2. {[3,3][4,4]} ->[S2,6701]
  3. {[5,5][6,6]} ->[S3,6701]
  4. {[7,7][8,8]} ->[S4,6700]
  5. {[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]}
相關文章
相關標籤/搜索