更新时间:2023-11-07 GMT+08:00

Storm基本原理

Apache Storm是一个分布式、可靠、容错的实时流式数据处理的系统。在Storm中,先要设计一个用于实时计算的图状结构,称之为拓扑(topology)。这个拓扑将会被提交给集群,由集群中的主控节点(master node)分发代码,将任务分配给工作节点(worker node)执行。一个拓扑中包括spout和bolt两种角色,其中spout发送消息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在bolt中可以完成计算、过滤等操作,bolt自身也可以随机将数据发送给其他bolt。由spout发射出的tuple是不可变数组,对应着固定的键值对。

图1 Storm基本架构

业务处理逻辑被封装进Storm中的Topology中。一个Topology是由一组Spout组件(数据源)和Bolt组件(逻辑处理)通过Stream Groupings进行连接的有向无环图(DAG)。Topology里面的每一个Component(Spout/Bolt)节点都是并行运行的。在Topology里面, 可以指定每个节点的并行度,Storm则会在集群里面分配相应的Task来同时计算,以增强系统的处理能力。

图2 Topology

Storm有众多适用场景:实时分析、持续计算、分布式ETL等。Storm有如下几个特点:

  • 适用场景广泛
  • 易扩展,可伸缩性高
  • 保证无数据丢失
  • 容错性好
  • 易于构建和操控
  • 多语言

Storm作为计算平台,在业务层为用户提供了更为易用的业务实现方式:CQL(Continuous Query Language—持续查询语言)。CQL具有以下几个特点:

  • 使用简单:CQL语法和标准SQL语法类似,只要具备SQL基础,通过简单地学习,即可快速地进行业务开发。
  • 功能丰富:CQL除了包含标准SQL的各类基本表达式等功能之外,还特别针对流处理场景增加了窗口、过滤、并发度设置等功能。
  • 易于扩展:CQL提供了拓展接口,以支持日益复杂的业务场景,用户可以自定义输入、输出、序列化、反序列化等功能来满足特定的业务场景
  • 易于调试:CQL提供了详细的异常码说明,降低了用户对各种错误的处理难度。

关于Storm的架构和详细原理介绍,请参见:https://storm.apache.org/

Storm原理

  • 基本概念
    表1 概念介绍

    概念

    说明

    Tuple

    Storm核心数据结构,是消息传递的基本单元,不可变Key-Value对,这些Tuple会以一种分布式的方式进行创建和处理。

    Stream

    Storm的关键抽象,是一个无边界的连续Tuple序列。

    Topology

    在Storm平台上运行的一个实时应用程序,由各个组件(Component)组成的一个DAG(Directed Acyclic Graph)。一个Topology可以并发地运行在多台机器上,每台机器上可以运行该DAG中的一部分。Topology与Hadoop中的MapReduce Job类似,不同的是,它是一个长驻程序,一旦开始就不会停止,除非人工中止。

    Spout

    Topology中产生源数据的组件,是Tuple的来源,通常可以从外部数据源(如消息队列、数据库、文件系统、TCP连接等)读取数据,然后转换为Topology内部的数据结构Tuple,由下一级组件处理。

    Bolt

    Topology中接受数据并执行具体处理逻辑(如过滤,统计、转换、合并、结果持久化等)的组件。

    Worker

    是Topology运行态的物理进程。每个Worker是一个JVM进程,每个Topology可以由多个Worker并行执行,每个Worker运行Topology中的一个逻辑子集。

    Task

    Worker中每一个Spout/Bolt的线程称为一个Task。

    Stream groupings

    Storm中的Tuple分发策略,即后一级Bolt以什么分发方式来接收数据。当前支持的策略有:Shuffle Grouping, Fields Grouping, All Grouping, Global Grouping, Non Grouping, Directed Grouping。

    图3描述了一个由Spout、Bolt组成的DAG,即Topology。图中每个矩形框代表Spout或者Bolt,矩形框内的节点表示各个并发的Task,Task之间的“边”代表数据流——Stream。

    图3 Topology示意图
  • 可靠性

    Storm提供三种级别的数据可靠性:

    • 至多一次:处理的数据可能会丢失,但不会被重复处理。此情况下,系统吞吐量最大。
    • 至少一次:保证数据传输可靠,但可能会被重复处理。此情况下,对在超时时间内没有获得成功处理响应的数据,会在Spout处进行重发,供后续Bolt再次处理,会对性能稍有影响。
    • 精确一次:数据成功传递,不丢失,不冗余处理。此情况下,性能最差。

    可靠性不同级别的选择,需要根据业务对可靠性的要求来选择、设计。例如对于一些对数据丢失不敏感的业务,可以在业务中不考虑数据丢失处理从而提高系统性能;而对于一些严格要求数据可靠性的业务,则需要使用精确一次的可靠性方案,以确保数据被处理且仅被处理一次。

  • 容错

    Storm是一个容错系统,提供较高可用性。表2从Storm的不同部件失效的情况角度解释其容错能力:

    表2 容错能力

    失效场景

    说明

    Nimbus失效

    Nimbus是无状态且快速失效的。当主Nimbus失效时,备Nimbus会接管,并对外提供服务。

    Supervisor失效

    Supervisor是工作节点的后台守护进程,是一种快速失效机制,且是无状态的,并不影响正在该节点上运行的Worker,但是会无法接收新的Worker分配。当Supervisor失效时,OMS会侦测到,并及时重启该进程。

    Worker失效

    该Worker所在节点上的Supervisor会在此节点上重新启动该Worker。如果多次重启失败,则Nimbus会将该任务重新分配到其他节点。

    节点失效

    该节点上的所有分配的任务会超时,而Nimbus会将这些Worker重新分配到其他节点。

Storm开源特性

  • 分布式实时计算框架

    开源Storm集群中的每台机器上都可以运行多个工作进程,每个工作进程又可创建多个线程,每个线程可以执行多个任务,任务是并发进行数据处理。

  • 高容错

    如果在消息处理过程中有节点、进程等出现异常,提供重新部署该处理单元的能力。

  • 可靠的消息保证

    支持At-Least Once、At-Most Once、Exactly Once的数据处理模式。

  • 安全机制

    提供基于Kerberos的认证以及可插拔的授权机制,提供支持SSL的Storm UI以及Log Viewer界面,同时支持与大数据平台其他组件(如ZooKeeper,HDFS等)进行安全集成。

  • 灵活的拓扑定义及部署

    使用Flux框架定义及部署业务拓扑,在业务DAG发生变化时,只需对YAML DSL(domain-specific language)定义进行修改,无需重新编译及打包业务代码。

  • 与外部组件集成

    支持与多种外部组件集成,包括:Kafka、HDFS、HBase、Redis或JDBC/RDBMS等服务,便于实现涉及多种数据源的业务。