Storm基础篇七-Storm拓扑中的并行度
运行拓扑的组成部分: 工作进程(worker), 执行器(executors)和任务(tasks)
在一个 Storm 集群中,Storm 主要通过以下三个部件来运行拓扑:
Worker processes:worker进程
Executors (threads):执行器(线程)
Tasks:任务
下面是它们之间关系的简单示意图:
一个 worker 进程运行的是一个拓扑的一个子集。一个 worker 进程是从属于某一个具体的拓扑的,可能会运行一个或者多个与拓扑中的组件(spouts/bolts)相关联的 executor。一个运行中的拓扑就是由这些运行于 Storm 集群中的很多机器上的进程组成的。
一个 executor 是由 worker 进程生成的一个线程。在 executor 中可能会有一个或者多个 task,这些 task 都是为同一个组件(spout 或者 bolt)服务的。
task 负责执行实际的数据处理,在你代码中实现的每个 spout 或者 bolt 都会在集群中运行许多 tasks。一个组件的 tasks 数量在整个拓扑的生命周期保持不变,不过组件的 executors(线程)数量可能随时间发生改变。也就是说 #threads ≤ #tasks
条件恒为真。默认情况下,tasks 的数量等于 executors 的数量,也就是说 Storm 会在每个线程上执行一个 task。
配置拓扑的并行度
Storm 中 “parallelism” 术语指的是所谓的 parallelism_hint
,它代表着一个组件的初始 executor(线程)数量。在这篇文章里,我们使用这个“并行度”术语来说明在 Storm 拓扑中既可以配置 executor 的数量,也可以配置 worker 和 task 的数量。如果“并行度”的概念需要表示其他的一般情况,也会特别指出。
接下来部分展示了很多可配置选项,以及如何在代码中配置它们。可用于配置的方法有许多种,这里列出的只是其中一部分。需要注意的是 Storm 配置的优先级为: defaults.yaml
< storm.yaml
< topology-specific configuration < internal component-specific configuration < external component-specific configuration
worker(进程) 的数量
描述:在集群中为该拓扑创建的 worker 数量。
配置选项:TOPOLOGY_WORKERS
如何在你代码中配置(示例):
Config#setNumWorkers
executors(线程)数量
描述:每个组件所需的 executor 数量。
配置选项:没有拓扑级的配置选项(通过
setSpout
或setBolt
设置parallelism_hint
参数)如何在你代码中配置(示例):
TopologyBuilder#setSpout()
TopologyBuilder#setBolt()
Note:从 Storm 0.8 开始
parallelism_hint
参数代表 executor 的数量,而不是 task 的数量
tasks(任务)数量
描述:每个组件所需创建的任务数量。
配置选项:TOPOLOGY_TASKS
如何在你的代码中配置(示例):
ComponentConfigurationDeclarer#setNumTasks()
以下是配置上述参数的一个简单示例代码:
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) .setNumTasks(4) .shuffleGrouping("blue-spout");复制代码
在上述代码中,我们为 GreenBolt
初始化配置了2个 executor 和4个关联任务。Storm 将在每个 executor 上运行两个任务。如果你在设置 bolt 的时候没有指定 task 的数量,那么默认情况下,Storm 中 executor 的 task 数设置为 1。
拓扑示例
下图展示了一个与实际接近的简单拓扑。拓扑又三个组件构成:名为 BlueSpout
的 spout 以及两个名分别为 GreenBolt
和 YellowBolt
的 bolt。这些组件之间的关系是:BlueSpout
将它的输出发送到 GreenBolt
中,然后GreenBolt
将消息继续发送到 YellowBolt
中。
简单分析:上图为一个包含了两个 worker 进程的拓扑。其中,蓝色的 BlueSpout
有两个 executor,每个 executor 中有一个 task,并行度为 2;绿色的 GreenBolt
有两个 executor,每个 executor 有两个 task,并行度也为2;而黄色的YellowBolt
有 6 个 executor,每个 executor 中有一个 task,并行度为 6,因此,这个拓扑的总并行度就是 2 + 2 + 6 = 10。具体分配到每个 worker 就有 10 / 2 = 5 个 executor。
GreenBolt
配置了 task 数,而 BlueSpout
和 YellowBolt
仅仅配置了 executor 数。下面是相关代码:
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_MAX_TASK_PARALLELISM: 该配置项设置了一个组件最多可分配 executor 数的上限。一般用于在本地模式运行拓扑时测试分配线程的数量限制,你可以通过Config#setMaxTaskParallelism()来配置该参数。
如何改变运行中拓扑的并行度
Storm 一个比较实用的点就在于你可以增加或减少 worker 或 executor 的数量而不用重启集群或拓扑。这个方法叫做再平衡(rebalancing)。
有两种方式可以对一个拓扑执行 rebalance 操作:
通过Storm UI界面来再平衡拓扑。
通过以下所示的客户端工具来再平衡拓扑。
## 重新配置 "mytopology" 拓扑的 worker 数为 5, ## spout "blue-spout" 的 executor 数为3, ## bolt "yellow-bolt" 的 executor 数为10. $ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
作者:这猫叫大黄
链接:https://juejin.cn/post/7027813143782899743