Scheduler是storm的调度器,负责为topology分配当前集群中可用的资源。Storm分别提供了3中调度器:

  1. EvenScheduler:会将系统中的可用资源均匀地分配给当前需要任务分配的多个topology。
  2. DefaultScheduler:跟EvenScheduler基本上一样,唯一区别在于它在为topology分配任务之前先释放掉其他Topology不再需要的资源,然后调用EvenScheduler方法为topology均匀分配资源。
  3. IsolationScheduler:它有比较特殊的机制,使得用户可以单独为某些topology指定它们需要的机器资源(机器数)。用户需要在storm配置项中指定这些信息,IsolationScheduler会优先对这些Topology分配任务,保证分配给某个topology的机器只能运行这个特定的topology,也就是说这些topology的运行环境是相互独立的。

这三个调度器是用clojure写的,先忽略掉,等待后面分析源码部分再写。

先来举一个实际例子,看一下storm的调度过程,相信大家一看都能明白。

【场景】假设当前集群中有6台机器,每台机器上可用端口均为6700、6701、6702、6703,并且当前急群中没有正在运行的topology,初始状态如如所示:

storm中的Scheduler-LMLPHP

下表是我们依次要提交的3个topology:

TopologyWorker数目Executor数目Task数目
T-13816
T-251010
T-381616

正常情况下,EvenScheduler和DefaultScheduler的调度结果是一致的,这两个可以放在一起。看看会经过如下阶段:

1、提交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]

此时,集群中的任务分配情况为:

storm中的Scheduler-LMLPHP

2、提交T-2

  • 可用的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]

此时集群中的任务分配情况如下:

storm中的Scheduler-LMLPHP

3、提交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]}
04-21 04:30