运行时topology的组成:worker processes、executors(执行者线程)以及tasks
Storm区分了以下三个主要的实体并用来在Storm集群上运行起一个topology:
1.Worker processes
2.Executors(线程)
3.Tasks
下面是这3者关系的一个简单示例:
一个worker process负责执行topology的部分子集。单个worker process归属于一个特定的topology并且可以为该topology的一个或多个组件(spouts或者bolts)运行一个或者多个executors。一个运行的topology由Storm集群中多台机器上运行着的多个processes(进程)组成。
一个executor其实就是由一个worker process生成的线程。executor将会为同一个组件(spout/bolt)运行多个tasks(任务)。
一个task负责进行数据处理---我们的代码实现的每个spout或者bolt会在集群上执行许多的任务。一个组件的tasks的数量在topology的整个生命周期中都是一样的。但是一个组件的executors的数量却会改变。这就意味着出出现这样一种情形:#threads <= #tasks。默认情况下,executor的数量与task的数量会设置成一样。例如:Storm中会每个executor运行一个task。
topology的并发设置
注意Storm中的术语"parallelism"被用来特指Storm中的parallelism hint,parallelism hint的意思是一个组件的初识executor的数量。这个文档中我们就用"parallelism"(并发)这个更宽泛的术语来描述:不仅仅限于executors的数量,还有worker processes的数量以及tasks的数量。在用"parallelism"来标识正常或者更特指的定义时,我们会特别提醒的。
接下来对多种配置选项的一个概览。我在Storm配置概览这篇文章中提到了Storm配置的优先级:defaults.yaml<storm.yaml<topology-specific configuration<internal component-specific configuration<external component-specific configuration。
worker processes的数量
·描述:为topology在集群机器上创建多少work processes。
·配置项:TOPOLOGY_WORKERS
·如何在代码中设置
executors(线程)的数量
·描述:每个组件产生多少executors
·配置项:无(通过setSpout或者setBolt中的parallelism_hint参数设置)
task的数量
·描述:为每个组件创建多少task
·配置项:TOPOLOGY_TASKS
·如何在代码中设置(只是个例子):
·ComponentConfigurationDeclarer#setNumTasks()
下面给出了这些配置的一个例子
-
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
-
.setNumTasks(4)
-
.shuffleGrouping("blue-spout");
在代码中我们配置了Storm中的bolt(GreenBolt)其中初始的executor数量为2以及相关taks数为4。Storm将会使每个executor运行两个task。如果没有显式的配置task数,Storm会每个executor运行一个task。
一个运行中的topology示例
下面这个示例展示了一个简单的topology的运行。这个topology有3个组件组成:一个spout(BlueSpout)以及两个bolt(GreenBolt和YellowBolt)。由BlueSpout发送线性给GreenBolt,然后,GreenBolt发送消息给YellowBolt。
下面给出相应代码:
-
Config conf = new Config();
-
conf.setNumWorkers(2); // use two worker processes
-
topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 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()
-
);
可以看到,BlueSpout与YellowBolt未设置task数,故默认task数与executor数相同。而GreenBolt设置了task数为4,故每个executor运行两个task。
Storm有额外的配置设置来控制topology的并发数:
·TOPOLOGY_MAX_TASK_PARALLELISM:这个设置对每个组件能生成的executor数设置了一个上限。这个典型的是在测试的时候,我们在本地模式下限制线程的数量。我们可以通过 Config#setMaxTaskParallelism()来进行设置。
如何改变一个运行中的topology的并发量
Storm中的一个灵活的特征就是我们可以在不重启集群或者topology的情况下改变worker proceses以及executors的数量。这个过程叫做rebalancing(再均衡)
我们有两个选项来进行再均衡:
1.用Storm提供的web界面
2.通过命令行(CLI)工具
下面给出命令行工具的例子:
## Reconfigure the topology "mytopology" to use 5 worker processes,
## the spout "blue-spout" to use 3 executors and
## the bolt "yellow-bolt" to use 10 executors.
$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10