Storm是按照下面3种主要的部分来区分Storm集群中一个实际运行的拓扑的:
Worker进程
Executors (线程)
Tasks
下图简单的展示了它们的关系:
配置拓扑的并发度
注意Storm的术语"并发度(parallelism)"是特别用来描述所谓的parallelism hint的,这代表1个组件的初始的executor(线程)的数量。在此文档中我们使用术语"并发度"的一般意义来描述你不但可以配置executor的数量,还可以配置worker进程的数量,还可以是1个拓扑的task的数量。在用到并发度的狭义的定义时我们会特别提出。
下面的小节给出了一些不同的配置选项,还有你如何在代码中设置它们。有多种方法可以进行设置,表格列举了其中几种。Storm目前有下列的配置优先级:defaults.yaml < storm.yaml < 特定拓扑的配置 < 内部特定组件的配置 < 外部特定组件的配置。
worker进程的数量
- 描述: 1个拓扑有多少个分布于集群中的机器的worker进程
- 配置选项: TOPOLOGY_WORKERS
- 如何在代码中设置 (例子):
executor的数量 (线程)
- 描述: 每个组件会有多少个executor
- 配置选项: ?
- 如何在代码中设置 (例子):
- TopologyBuilder#setSpout()
- TopologyBuilder#setBolt()
- 注意在Storm 0.8以后
parallelism_hint参数指定的是bolt的初始的executor的数量。
task的数量
- 描述: 每个组件有多少task
- 配置选项: TOPOLOGY_TASKS
- 如何在代码中设置 (例子):
这是一个简单的代码例子,展示了在实践中如何设置:
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4).shuffleGrouping("blue-spout);
在上面的代码中我们配置了Storm运行GreenBolt指定了初始有2个executor和4个关连的task。Storm会在每个 executor(线程)2个task。如果你不想显式的配置task的数量,Storm会默认的为每个executor运行1个task。
一个运行中的拓扑的例子
下 面的图表展示了1个简单拓扑在实际操作中看起来是怎样的。这个拓扑包含了3个组件:1个spout叫做BlueSpout,2个bolt分别叫 GreenBolt和YellowBolt。BlueSpout发送它的输出到GreenBolt,GreenBolt又把它的输出发到 YellowBolt。
下面是对上图的简要分析:
3个组件的并发度加起来是10,就是说拓扑一共有10个executor,一共有2个worker,每个worker产生10 / 2 = 5条线程。
绿色的bolt配置成2个executor和4个task。为此每个executor为这个bolt运行2个task。
下面的代码配置了这3个组件
,相关代码如下:
Config conf = new Config();
conf.setNumWorkers(2); // 使用2个worker进程
topologyBuilder.setSpout(“blue-spout”, new BlueSpout(), 2); // parallelism hint为2
topologyBuilder.setBolt(“green-bolt”, new GreenBolt(), 2) .setNumTasks(4) .shuffleGrouping(“blue-spout”);
topologyBuilder.setBolt(“yellow-bolt”, new YellowBolt(), 6) .shuffleGrouping(“green-bolt”);
StormSubmitter.submitTopology( “mytopology”, conf, topologyBuilder.createTopology() );
And of course Storm comes with additional configuration settings to control the parallelism of a topology, including:
此外还有其他的配置来控制拓扑的并发度,包括了:
- TOPOLOGY_MAX_TASK_PARALLELISM: 这个设置指定了1个单独的组件的executor的数量的上限。当在测试阶段使用本地模式运行1个拓扑时,用来限制生成的线程的数量。你可以像下面这样来使用:
- Config#setMaxTaskParallelism().
如何改变1个正在运行的拓扑的并发度
Storm有一个不错的特性,你可以在不需要重启集群或拓扑,来增加或减少worker进程和executor的数量。这样行为成为rebalancing。
你有两个选项可以rebalance1个拓扑:
- 使用Storm的web UI来rebalance。
- 像下面描述的那样,使用命令行工具来做:
# 重新配置拓扑 “mytopology” 使用5个worker进程。
# spout “blue-spout” 使用3个executor
# bolt “yellow-bolt” 使用10个executor
$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10