Storm基础篇七-Storm拓扑中的并行度

558 阅读2分钟

理解 Storm 拓扑中并行度(Parallelism)的概念

运行拓扑的组成部分: 工作进程(worker), 执行器(executors)和任务(tasks)

在一个 Storm 集群中,Storm 主要通过以下三个部件来运行拓扑:

  1. Worker processes:worker进程
  2. Executors (threads):执行器(线程)
  3. Tasks:任务

下面是它们之间关系的简单示意图:

The relationships of worker processes, executors (threads) and tasks in Storm

一个 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(进程) 的数量

executors(线程)数量

  • 描述:每个组件所需的 executor 数量。

  • 配置选项:没有拓扑级的配置选项(通过setSpout 或 setBolt 设置 parallelism_hint 参数)

  • 如何在你代码中配置(示例):

tasks(任务)数量

以下是配置上述参数的一个简单示例代码:

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 中。

Example of a running topology in Storm

简单分析:上图为一个包含了两个 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 也有一些其他的配置项来控制拓扑的并行度,包含:

如何改变运行中拓扑的并行度

Storm 一个比较实用的点就在于你可以增加或减少 worker 或 executor 的数量而不用重启集群或拓扑。这个方法叫做再平衡(rebalancing)。

有两种方式可以对一个拓扑执行 rebalance 操作:

  1. 通过Storm UI界面来再平衡拓扑。
  2. 通过以下所示的客户端工具来再平衡拓扑。
## 重新配置 "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

该博客仅为初学者自我学习的记录,粗浅之言,如有不对之处,恳请指正。

参考资料