apache-storm - 了解 Storm 架构

标签 apache-storm

我一直在努力理解 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 NodesWorker Processes

我认为是真的

游戏中的实体

  • 主节点 = 管理服务器
  • 工作节点 = 从属节点
  • Nimbus JVM 进程,运行在主节点
  • ZooKeeper JVM 进程,在 ZooKeeper 节点上运行
  • Supervisor JVM 进程,运行在Worker Nodes
  • 工作进程 (JVM),在工作节点上运行
  • Executor 线程,由 Worker Process 运行
  • Task(BoltsSpouts 的实例),由 Executor
  • 执行

事情是如何运作的

Nimbus 是一个 JVM 进程,运行在物理 Master Node 上,它接收我的程序(Storm 拓扑),将 Bolts and Spouts 并从中生成任务。如果一个 Bolt 应该被并行化 3 次,Nimbus 会为其生成三个任务NimbusZooKeeper JVM 进程询问集群的配置,例如在何处运行这些任务ZooKeeper JVM 进程告诉Nimbus。为了做到这一点,ZooKeeperSupervisors 进行通信(它们是什么稍后介绍)。 Nimbus 然后将任务分发给 Workers Nodes,它们是物理节点。 Worker NodesSupervisors 管理,它们是 JVM 进程 - 一个 Supervisor 对应一个 Worker Node主管 管理(启动、停止等)工作进程,它们是在工作节点 上运行的 JVM 进程。每个 Worker Node 都可以运行多个 Worker Processes工作进程 是 JVM 进程。它们运行一个或多个称为Executors 的线程。每个 Executor Thread 运行一个或多个 Tasks,这意味着 BoltSpout 的一个或多个实例,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/

相关文章:

apache-storm - Storm - DRPC 与事务型与 Trident - 何时使用什么?

apache-storm - Apache Storm 中 Fields 类的用途是什么

bigdata - Storm 的 HdfsBolt 也可以在超时后刷新数据吗?

java - 比较不透明或事务性 Kafka spout

status - 如何通过java代码获取 Storm 拓扑状态?

java - 如何让一个 spout 等待另一个 spout?

java - 错误 : A JNI error has occurred, 请检查您的安装并重试。NoClassDefFounderror: DRPC ExecutionException

java - 如何使用 Eclipse 在本地实现 Storm 项目中的日志更改

java - 我的 KafkaSpout 不使用 HDP 中来自 Kafka Brokers 的消息

java - 提交 Storm 拓扑失败/开始)