运行中的topology由这些组成:worker processes, executors and tasks
Storm集群的topology主要由以下实体组成:
- Worker processes
- Executors (threads)
-
Tasks
它们的关系如下:
Worker processes执行topology的一个子集,它属于某个topology,可以运行一个或多个executors。在集群中运行的topology一般都有多个Worker processes跑在多个机器上。
executor 是Worker 创建的线程,它可能会运行同一个组件的(spout或bolt)一个或多个任务。
task真正负责数据处理。你代码中实现的spout或bolt在集群中以task对形式执行。
在topology的整个生命周期中,task的数量都不会变,但是executors(threads)的数量可能会经常变化。下面这个等式总是正确的:#threads ≤ #tasks
默认情况下,task和executors数量相同,也就是说,Storm会每个线程执行一个任务。
配置topology的并行度
Storm的并行度指的是组件最开始的executor数量。在这篇文章中,并行度是一个更宽泛的概念,你不仅可以配置executor的数量,也可以配置worker和task的数量。
下面的章节给出了多种配置选项以及如何在代码中设置它们。Storm目前的配置获取顺序:defaults.yaml < storm.yaml < topology-specific configuration < internal component-specific configuration < external component-specific configuration
。
Number of worker processes
- 配置选项:TOPOLOGY_WORKERS
- 如何在代码中设置(例子):Config#setNumWorkers
Number of executors (threads)
- 配置选项:无(给setSpout或setBolt传parallelism_hint参数)
- 如何在代码中设置:
TopologyBuilder#setSpout()
TopologyBuilder#setBolt()
Number of tasks
- 配置选项:TOPOLOGY_TASKS
- 如何在代码中设置:
ComponentConfigurationDeclarer#setNumTasks()
代码片段:
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4)
.shuffleGrouping("blue-spout");
上面的代码配置Storm以2个executors (threads)和4个tasks来运行GreenBolt,也就是每个线程跑两个任务。
一个正在运行的topology的例子
例子中但topology包含三个组件:BlueSpout、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()
);
当然,Storm也有其他的配置设置来控制topology的并发度,包括:
- TOPOLOGY_MAX_TASK_PARALLELISM: 这个配置限制了每个组件的最大executors数量。一般在本地模式下运行topology时,会用这个配置来限制创建的线程数。可以这样设置:Config#setMaxTaskParallelism()。
如何更改运行中的topology的并发度
Storm的一大优点就是可以不用重启集群或topology就更改worker和executors的数量。这种操作称为再平衡。
有两种再平衡topology的方式:
- Storm web UI
- CLI
这是使用CLI的例子:
//Reconfigure the topology "mytopology" to use 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