0%

storm简介

storm核心概念与架构详解

Storm 作为一款高性能的实时计算框架,在实时数据处理领域有着广泛的应用。本文将基于已有内容,对 Storm 的核心概念、架构设计及流处理机制进行更深入的解析,帮助读者全面理解 Storm 的工作原理。

Storm 架构深度解析

Storm 集群采用主从架构设计,通过清晰的角色分工实现高效的实时数据处理。

管理节点(Master Node)

管理节点上运行的 Nimbus 进程是整个 Storm 集群的 “大脑”,主要承担以下核心职责:

  • 代码分发:将用户提交的 Topology 代码分发到集群中的所有工作节点
  • 任务分配:根据集群资源状况和 Topology 配置,将任务合理分配给各个工作节点
  • 集群监控:实时监控集群中所有节点和任务的运行状态,当发现异常时尝试重新分配任务
  • 资源调度:动态管理集群资源,确保计算资源的高效利用

Nimbus 本身是无状态的,其所有决策所需的元数据都存储在 ZooKeeper 中,这使得 Nimbus 具备良好的容错性 —— 即使 Nimbus 进程重启,也能从 ZooKeeper 中恢复集群状态。

工作节点(Worker Node)

工作节点上的 Supervisor 进程负责具体任务的执行管理,主要功能包括:

  • 任务生命周期管理:接收 Nimbus 分配的任务,启动或关闭相应的工作进程(Worker Process)
  • 资源隔离:通过配置限制每个节点上运行的工作进程数量,实现资源隔离
  • 状态汇报:向 Nimbus 汇报本节点的任务执行状态

每个工作进程(Worker Process)会运行一个或多个 Executor(线程),而每个 Executor 负责执行一个或多个 Task(具体计算逻辑单元)。这种多级结构使得 Storm 能够灵活地进行并行计算。

协调机制

Nimbus 和 Supervisor 之间不直接通信,所有协调工作均通过 ZooKeeper 完成:

  • ZooKeeper 存储了集群的元数据、任务分配信息和节点状态
  • Nimbus 通过监听 ZooKeeper 的节点变化获取集群状态
  • Supervisor 通过 ZooKeeper 接收任务分配并汇报执行状态

这种基于 ZooKeeper 的协调机制,使得 Storm 集群具有良好的可扩展性和容错性。

核心概念详解

Topology(拓扑)

Topology 是 Storm 中进行实时计算的基本单位,相当于一个持续运行的计算任务,具有以下特点:

  • 无状态性:Topology 一旦启动将持续运行,直到被显式停止
  • 并行性:由多个组件(Spout 和 Bolt)组成,通过 Stream 连接形成一个有向无环图
  • 容错性:当某个组件失败时,Storm 会自动重新启动该组件

与 MapReduce 作业不同,MapReduce 作业有明确的开始和结束时间,而 Topology 会一直运行直到被手动终止,持续处理流入的数据。

Stream(流)

Stream 是 Storm 的核心抽象,代表一个无限的元组(Tuple)序列,具有以下特性:

  • 无界性:Stream 是持续产生的,理论上没有边界
  • 可扩展性:支持通过流分组机制实现灵活的并行处理
  • 可转换性:通过 Spout 和 Bolt 对 Stream 进行转换和处理

每个 Tuple 是一个命名值的列表,类似于数据库中的一行记录,其中的值可以是任意类型(整数、字符串、列表等)。

Spout(消息源)

Spout 是 Stream 的生产者,负责从外部数据源读取数据并发送到 Topology 中,主要类型包括:

  • 可靠 Spout:能够记住发送的 Tuple 并在失败时重新发送,确保数据不丢失
  • 不可靠 Spout:发送 Tuple 后不做跟踪,可能存在数据丢失风险,但性能更高

常见的 Spout 实现包括从 Kafka、RabbitMQ、数据库或文件系统读取数据的组件。

Bolt(消息处理者)

Bolt 是 Stream 的处理者,负责对 Tuple 进行处理、转换和存储,主要功能包括:

  • 数据处理:对输入的 Tuple 进行计算、过滤、聚合等操作
  • 数据转发:将处理结果作为新的 Tuple 发送到下一个 Bolt
  • 数据存储:将处理结果写入数据库、文件系统或其他存储系统

一个 Topology 中可以有多个 Bolt,通过 Stream 连接形成复杂的处理流水线。Bolt 可以订阅多个 Spout 或其他 Bolt 发送的 Stream。

Streams Groupings(流分组)

流分组定义了 Stream 中的 Tuple 如何在 Bolt 的多个并行 Task 之间分配,Storm 提供了 7 种流分组策略:

分组类型 特点 适用场景
Shuffle Grouping(随机分组) 随机分发 Tuple,使每个 Task 接收的 Tuple 数量大致相同 负载均衡场景,如简单的并行计算
Fields Grouping(字段分组) 按指定字段的值进行分组,相同字段值的 Tuple 分配到同一 Task 需要按关键字聚合的场景,如按用户 ID 聚合行为数据
ALL Grouping(广播分组) 将每个 Tuple 发送到 Bolt 的所有 Task 需要将数据复制到多个 Task 的场景,如数据字典分发
Global Grouping(全局分组) 所有 Tuple 都发送到 Bolt 的一个 Task(通常是 ID 最小的 Task) 需要全局聚合的场景,如计算总流量
None Grouping(无分组) 不指定分组策略,由 Storm 自行决定,通常与上游组件在同一线程执行 不需要特定分组的场景,可减少网络传输
Direct Grouping(直接分组) 由发送者显式指定接收的 Task 需要精确控制 Tuple 流向的场景
Local or Shuffle Grouping(本地或随机分组) 优先发送到本地 Task,否则使用随机分组 减少网络传输的场景,提高处理效率

选择合适的流分组策略对 Topology 的性能有显著影响,合理的分组策略可以减少网络传输,提高整体处理效率。

Storm 与其他计算框架的对比

与 Hadoop 的 MapReduce 相比,Storm 具有以下显著差异:

特性 Storm MapReduce
处理模式 实时流处理 批处理
运行方式 持续运行 任务完成后终止
延迟 毫秒级 分钟或小时级
数据处理 增量处理 全量处理
容错机制 自动重启失败任务 重新运行失败任务

Storm 更适合需要实时响应的场景,如实时日志分析、实时监控告警、实时推荐系统等;而 MapReduce 更适合离线的大规模数据处理。

欢迎关注我的其它发布渠道