storm的并行度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq447995687/article/details/84193599

storm的并行度

是什么组成了一个运行中的topology:工作进程(worker processes),执行器(executors)和任务(tasks)
在一个 Storm 集群中,Storm 主要通过以下三个部件来运行拓扑:

工作进程(worker processes)
执行器(executors)线程
任务(tasks)

这是官网放出的一个他们之间相互关系的图:

在这里插入图片描述

在 Worker 中运行的是拓扑的一个子集。一个 worker 进程是从属于某一个特定的拓扑的,在 worker 进程中会运行一个或者多个与拓扑中的组件相关联的 executor。一个运行中的拓扑就是由这些运行于 Storm 集群中的很多机器上的进程组成的。

一个 executor 是由 worker 进程生成的一个线程。在 executor 中可能会有一个或者多个 task,这些 task 都是为同一个组件(spout 或者 bolt)服务的。默认的是一个executor执行一个task

task 是实际执行数据处理的最小工作单元(注意,task 并不是线程) —— 在你的代码中实现的每个 spout 或者 bolt 都会在集群中运行很多个 task。在拓扑的整个生命周期中每个组件的 task 数量都是保持不变的,不过每个组件的 executor 数量却是有可能会随着时间变化。在默认情况下 task 的数量是和 executor 的数量一样的,也就是说,默认情况下 Storm 会在每个线程上运行一个 task。

设置storm的并行度

直接看代码是如何设置并行度的:

Config conf = new Config();
conf.setNumWorkers(2); // 设置2个work

topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // 设置blue-spout的executors个数

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) // 设置green-bolt的executors个数
               .setNumTasks(4) //设置green-bolt的task个数
               .shuffleGrouping("blue-spout"); //随机分组

topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6) // 设置yellow-bolt"的executors个数
               .shuffleGrouping("green-bolt"); //随机分组

StormSubmitter.submitTopology(
        "mytopology",
        conf,
        topologyBuilder.createTopology()
    );

上面的代码设置的topology的并行图如下:

在这里插入图片描述
图中是一个包含有两个 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。

由上面的例子我们可以看出一个topology的并行度其实与task没有实际的联系。topology在运行的时候task的数量是已知的不能执行更改,除非重新更改代码提交topology,而work和executor是可以动态更改的(rebalance)。
可以通过控制台更改一个topology的并行度:

## 重新配置拓扑 "mytopology",使得该拓扑拥有 5 个 worker processes,
## 另外,配置名为 "blue-spout" 的 spout 使用 3 个 executor,
## 配置名为 "yellow-bolt" 的 bolt 使用 10 个 executor。

$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10

总结:
worker即进程,一个worker就是一个进程,进程里面包含一个或多个线程,一个线程就是一个executor,一个executor会处理一个或多个任务,一个任务就是一个task,一个task就是一个组件类的实例对象,每个 spout 或者 bolt 组件都会在集群中运行很多个 task。

猜你喜欢

转载自blog.csdn.net/qq447995687/article/details/84193599