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]}