返回 导航

大数据

hangge.com

Storm - 核心原理、执行流程、运行架构详解

作者:hangge | 2025-02-07 10:56

一、基本介绍

1,什么是 Storm?

(1)Storm 是由 Twitter 开源的分布式实时数据计算引擎,从 0.9.1 版本开始归于 Apache 社区。Storm 可以称得上是大数据行业的第一代实时数据计算引擎。

(2)Storm 能实现高频数据和大规模数据的实时计算。对比 HadoopMapReduce 的离线计算,Storm 是一个实时的、分布式的、具备高容错的计算系统。

(3)Storm 的使用场景非常广泛,比如实时分析、在线机器学习、分布式 RPC、实时 ETL 等。Storm 非常高效 , 官网资料显示 Storm 的一个节点每秒钟能够处理 100 万个 100 byte 的消息(IntelE5645@2.4Ghz CPU24GB 的内存)。Storm 还具有良好的可扩展性和容错性,以及保证数据可以至少被处理一次等特性。

2,Storm 的不足

  • 不支持 ON YARN 模式:直到现在,Storm 2.x 版本依然不支持 ON YARN 模式,这导致 Storm 过于独立。要使用 Storm,则必须搭建独立的 Storm 集群,这会导致服务器资源成本和运维成本的增加,也会导致运维难度的增加。
  • 只支持实时数据计算Storm 没有自己的生态圈,只支持实时计算,所以它的发展受限。从 2017 年往后,使用 Storm 的公司变得越来越少了。
  • 没有提供高级 APIStorm 提供的 API 都是基础 API,使用起来比较复杂,常见的过滤、拆分这些功能也都需要程序员自己手工实现。

二、原理分析

1,核心组件

(1)Storm 中包含以下两个核心组件。
  • Spout:数据源,是数据的生产者。它负责从外部(例如 Kafka)读取数据,并将读取的数据发送给 Bolt 组件。
  • Bolt:数据处理,所有的数据处理逻辑都被封装到 Bolt 中。它负责处理接收到的数据流并产生新的输出数据流,可以执行的数据库过滤、聚合和查询等操作。

(2)SpoutBolt 可以组装成 Topology,组装成 Topology 后才可以被提交到 Storm 集群中运行。Topology 是用于封装 Storm 实时计算程序的拓扑,类似于将 MapReduce 中的 MapReduce 阶段组装成一个 Job 的过程。

(3)Topology 中的 SpoutBolt 都可以有一个或者多个。这意味着,在一个 Topology 中可能会同时存在多个 Spout 和多个 Bolt。一个 Topology 中需要用到多个 Spout 组件和多个 Bolt 组件通常有如下情况:
  • 如果一个实时数据计算任务的数据源有多个,那么就需要使用多个 Spout 组件,每个 Spout 组件对接一个数据源。
  • 如果一个实时数据计算任务的计算逻辑比较复杂,那么就需要使用多个 Bolt 组件,每个 Bolt 组件负责处理一部分业务逻辑(因为每个 Bolt 都可以并行执行,这样可以提高复杂计算逻辑的计算性能)。

2,核心设计思想

(1)Storm 计算引擎的核心设计思想是:
  • 将实时产生的一条条数据认为是一个无界的数据流,通过内部的 Spout 组件源源不断地产生数据流并发送出去,后面通过 Bolt 组件对接收到的数据流进行处理。
  • Bolt 组件可以有多个,每个 Bolt 组件都是一个独立的计算单元。
  • 把所有的 Spout 组件和 Bolt 组件组装成一个 Topology,这样就可以把整个实时数据处理流程串起来了。

(2)Storm 中的数据流被称为 StreamStream 是由一个个连续不断的 Tuple 组成的。TupleStorm 中数据传输的基本单位,代表的是一条数据。

(3)下面通过一个火车的案例详细分析一下 Storm 的核心设计思想:
  • Tuple:相当于火车中的一节车厢。Tuple 中存储数据(相当于车厢中的乘客)。
  • Stream:相当于一列火车,一列火车的车厢个数是有限的,但是 Stream 中的 Tuple 个数却是无限的,会一直源源不断地产生。
  • Spout:相当于火车的始发站,对应的是 Stream 的源头。
  • Bolt:相当于火车临时停靠的中间站点,在每个中间站点都会有一些乘客上车或者下车(相当于对 Tuple 中的数据进行计算)。最后一个 Bolt 是终点站,相当于对 Tuple 中的数据进行的最后计算,计算之后的最终结果就可以被输出到第三方存储介质中了。
  • Topology:相当于火车的运行规划图。将火车的始发站、中间站点和终点站规划好以后,火车就可以按计划运行了。

3,Storm 与 MapReduce 对比

为了更加清晰地理解 Storm 中实时数据计算的特性,在这里将其和 MapReduce 离线数据计算引擎做一个对比:
  • 数据来源MapReduce 处理的是 HDFSTB 级别的离线数据,Storm 处理的是实时新增的某一条数据。
  • 处理过程MapReduce 分为 Map 阶段和 Reduce 阶段。Storm 是用户自定义的处理流程,流程中可以包含多个步骤,这些步骤可以是数据源(Spout)或数据处理(Bolt)。
  • 是否结束MapReduce 最后肯定是要结束的。Storm 是不会结束的,程序执行到最后就阻塞在那,直到有新数据进入时再从头开始。
  • 处理速度MapReduce 以处理 HDFSTB 级别数据为目的,处理速度相对较慢。Storm 只需要处理新增的某一条数据即可,处理速度很快。
  • 适用场景MapReduce 是在处理批量离线数据时使用的,不讲究时效性。Storm 是在处理某一条新增数据时使用的,要讲时效性。

三、架构分析

1,集群架构

(1)要运行开发好的 Topology 任务,则需要单独部署 Storm 集群,因为 Storm 不支持 ON YARN 模式。Storm 集群中有以下两种类型的节点:
  • Master 节点:主节点,支持一个或者多个,可以实现高可用(HA)。Master 节点上会运行一个 Nimbus 进程,它类似于 Hadoop 集群中的 ResourceManagerNimbus 进程负责在集群范围内分发代码,以及为 Worker 节点分配任务和故障监测。
  • Worker 节点:从节点,支持多个。Worker 节点上会运行一个 Supervisor 进程,它类似于 Hadoop 集群中的 NodeManagerSupervisor 负责监听分配给它所在机器的任务,基于 Nimbus 分配给它的任务来决定启动或停止工作者进程(Worker Process)。

(2)Storm 集群的运行需要依赖 Zookeeper 集群,Zookeeper 集群负责多个 Nimbus 进程和多个 Supervisor 进程之间的所有协调工作。
  • Nimbus 进程和 Supervisor 进程都是快速失败(Fail-Fast)和无状态的,所有状态维持在 Zookeeper 中。这也就意味着,可以使用 kill 命令“杀掉” Nimbus 进程和 Supervisor 进程,重启后这两个进程将恢复状态并继续工作,就像什么也没发生一样。
  • 这种架构设计使得 Storm 极其稳定,因为 Master 节点并没有直接和 Worker 节点进行通信,而是借助 ZookeeperWorker 节点进行通信,这样可以分离 Master 节点和 Worker 节点之间的依赖,将状态信息存放在 Zookeeper 集群内以快速回复任何失败的一方,如下图所示。

(3)Worker ProcessStorm 集群的关系如下图所示:

2,Worker Process 内部架构

  • Topology 被任务提交到 Storm 集群后,集群中的 Master 节点中的 Nimbus 进程会对 Topology 进行拆分,将拆分出来的子任务分发到多个 Worker 节点中,Worker 节点中的 Supervisor 进程监听到分配给它的任务后会启动一些工作者进程(Worker Process)。
  • Strom 集群中的每个 Worker 节点可以启动 1 个或者多个 Worker ProcessWorker Process 其实就是一个 Java 进程。假设 Storm 集群中的某一个 Worker 节点有 4CPU,那么建议这个 Worker 节点最多启动 4Worker ProcessWorker Process 会执行 Topology 中的子任务。
  • 在一个 Worker Process 中会运行一个或者多个 Executor(线程),每个 Executor 中会运行同一个组件(Spout 或者 Bolt)的一个或者多个 Task(任务)。
  • Task 是最终完成数据处理的实体单元,它其实执行的就是 Spout 组件或者 Bolt 组件中的核心代码
评论

全部评论(0)

回到顶部