我一直在努力理解 Storm 架构,但我不确定我是否理解正确。我会尽量准确地解释我认为的情况。请解释什么 - 如果 - 我错了,什么是对的。
初步想法: worker
http://storm.apache.org/releases/2.0.0-SNAPSHOT/Understanding-the-parallelism-of-a-Storm-topology.html 表明 Worker 是一个进程,就像 http://storm.apache.org/releases/2.0.0-SNAPSHOT/Concepts.html 一样,“worker 进程。每个 worker 进程都是一个物理 JVM”,但是 http://storm.apache.org/releases/1.0.1/Setting-up-a-Storm-cluster.html 表明 worker 是一个具有“Nimbus 和 worker 机器”的节点。网站 http://www.michael-noll.com/tutorials/running-multi-node-storm-cluster/ 提到“主节点”和“工作节点”。那又怎样:worker 是进程还是物理节点(或者节点是进程)?因此,我认为有两件事:Worker Nodes 和Worker Processes。
我认为是真的
游戏中的实体
- 主节点 = 管理服务器
- 工作节点 = 从属节点
- Nimbus JVM 进程,运行在主节点
- ZooKeeper JVM 进程,在 ZooKeeper 节点上运行
- Supervisor JVM 进程,运行在Worker Nodes
- 工作进程 (JVM),在工作节点上运行
- Executor 线程,由 Worker Process 运行
- Task(Bolts 和 Spouts 的实例),由 Executor 执行
事情是如何运作的
Nimbus 是一个 JVM 进程,运行在物理 Master Node 上,它接收我的程序(Storm 拓扑),将 Bolts and Spouts 并从中生成任务。如果一个 Bolt 应该被并行化 3 次,Nimbus 会为其生成三个任务。 Nimbus 向 ZooKeeper JVM 进程询问集群的配置,例如在何处运行这些任务,ZooKeeper JVM 进程告诉Nimbus。为了做到这一点,ZooKeeper 与 Supervisors 进行通信(它们是什么稍后介绍)。 Nimbus 然后将任务分发给 Workers Nodes,它们是物理节点。 Worker Nodes 由 Supervisors 管理,它们是 JVM 进程 - 一个 Supervisor 对应一个 Worker Node。 主管 管理(启动、停止等)工作进程,它们是在工作节点 上运行的 JVM 进程。每个 Worker Node 都可以运行多个 Worker Processes。 工作进程 是 JVM 进程。它们运行一个或多个称为Executors 的线程。每个 Executor Thread 运行一个或多个 Tasks,这意味着 Bolt 或 Spout 的一个或多个实例,but those have to be of the same Bolt。
如果这一切都是真的,那么问题就来了:
- 在一个工作节点上运行多个工作进程有什么意义 - 毕竟一个进程可以使用多个处理器内核,对吧?
- 如果多个Tasks 必须属于同一个Bolt/,那么让多个Tasks 由一个Executor 线程运行有什么意义喷??一个线程只在一个处理器核上运行,所以多个Bolt/Spout必须依次运行,不能并行。在 Storm 拓扑中无限期运行 - 在一个 Exectuor 线程中有两个相同的 Bolt/Spout 实例有什么意义?
编辑: 很好的附加资源:http://www.tutorialspoint.com/apache_storm/apache_storm_cluster_architecture.htm
最佳答案
首先进行一些说明(基本上您做对了)。
- 术语“节点”和“进程”并不总是一致地使用(不幸的是)。但是您的“游戏中的实体”是正确的。
- 关于并行化:任务数量由
.setNumTasks()
决定——如果没有指定,则与parallelism_hint
相同(设置执行器数量). - 关于部署:Nimbus 从 ZK 获取集群配置,但 ZK 不决定在哪里运行任务——Nimbus 有一个调度程序组件来做出这个决定(基于给定的拓扑、拓扑配置、和集群配置)。
回答你的问题:
- 单个工作进程仅执行来自单个拓扑的任务。因此,如果您想运行多个拓扑,则需要多个工作 JVM。这种设计的原因是容错,即拓扑的隔离。如果一个拓扑失败(可能是由于错误的用户代码),崩溃的 JVM 不会影响其他正在运行的拓扑。
- 任务允许在运行时动态重新平衡和更改并行度。如果没有任务,如果您想更改 spout/bolt 的并行度,则需要停止并重新部署拓扑。因此,任务的数量定义了 spout/bolt 的最大并行度。参见 https://storm.apache.org/releases/1.0.1/Understanding-the-parallelism-of-a-Storm-topology.html
关于apache-storm - 了解 Storm 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38221646/