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]}
相关文章
相关标签/搜索