Scheduler是storm的调度器,负责为topology分配当前集群中可用的资源。Storm分别提供了3中调度器:
- EvenScheduler:会将系统中的可用资源均匀地分配给当前需要任务分配的多个topology。
- DefaultScheduler:跟EvenScheduler基本上一样,唯一区别在于它在为topology分配任务之前先释放掉其他Topology不再需要的资源,然后调用EvenScheduler方法为topology均匀分配资源。
- IsolationScheduler:它有比较特殊的机制,使得用户可以单独为某些topology指定它们需要的机器资源(机器数)。用户需要在storm配置项中指定这些信息,IsolationScheduler会优先对这些Topology分配任务,保证分配给某个topology的机器只能运行这个特定的topology,也就是说这些topology的运行环境是相互独立的。
这三个调度器是用clojure写的,先忽略掉,等待后面分析源码部分再写。
先来举一个实际例子,看一下storm的调度过程,相信大家一看都能明白。
【场景】假设当前集群中有6台机器,每台机器上可用端口均为6700、6701、6702、6703,并且当前急群中没有正在运行的topology,初始状态如如所示:
下表是我们依次要提交的3个topology:
Topology | Worker数目 | Executor数目 | Task数目 |
T-1 | 3 | 8 | 16 |
T-2 | 5 | 10 | 10 |
T-3 | 8 | 16 | 16 |
正常情况下,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,2][3,4][5,6]} ->[S1,6700]
- {[7,8][9,10][11,12]} ->[S2,6700]
- {[13,14][15,16]} ->[S3,6700]
此时,集群中的任务分配情况为:
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][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]
此时集群中的任务分配情况如下:
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]}