Apache Storm - 核心概念

  • 简述

    Apache Storm 从一端读取实时数据的原始流,并将其通过一系列小型处理单元,并在另一端输出处理/有用的信息。
    下图描述了 Apache Storm 的核心概念。
    核心理念
    现在让我们仔细看看 Apache Storm 的组件 -
    组件 描述
    Tuple Tuple 是 Storm 中的主要数据结构。它是有序元素的列表。默认情况下,Tuple 支持所有数据类型。通常,它被建模为一组逗号分隔值并传递给 Storm 集群。
    Stream Stream 是一个无序的Tuple 序列。
    Spouts 流的来源。一般来说,Storm 接受来自原始数据源的输入数据,如 Twitter Streaming API、Apache Kafka 队列、Kestrel 队列等。否则,您可以编写 spout 从数据源读取数据。“ISpout”是实现spout的核心接口,具体接口有IRichSpout、BaseRichSpout、KafkaSpout等。
    Bolts Bolts 是逻辑处理单元。Spout 将数据传递给 bolts 和 bolts 进程并产生一个新的输出流。Bolts 可以执行过滤、聚合、连接、与数据源和数据库交互的操作。Bolt 接收数据并发送到一个或多个 Bolt。“IBolt”是实现bolt的核心接口。一些常用的接口有 IRichBolt、IBasicBolt 等。
    让我们以“Twitter 分析”的实时示例为例,看看它是如何在 Apache Storm 中建模的。下图描述了结构。
    推特分析
    “Twitter 分析”的输入来自 Twitter 流 API。Spout 将使用 Twitter 流 API 读取用户的推文,并以Tuple 流的形式输出。来自 spout 的单个Tuple 将具有 twitter 用户名和单个 tweet 作为逗号分隔值。然后,这组Tuple 将被转发到 Bolt,Bolt 会将推文拆分为单个单词,计算字数,并将信息保存到配置的数据源中。现在,我们可以通过查询数据源轻松获得结果。
  • Topology

    Spout 和 Bolt 连接在一起并形成Topology 。实时应用程序逻辑在 Storm Topology 中指定。简单来说,Topology 是一个有向图,其中顶点是计算,边是数据流。
    一个简单的Topology 结构从 spout 开始。Spout 将数据发送到一个或多个Bolts 。Bolt 表示Topology 中具有最小处理逻辑的节点,并且可以将一个 Bolt 的输出作为输入发送到另一个 Bolt。
    Storm 保持Topology 始终运行,直到您终止Topology 。Apache Storm 的主要工作是运行Topology 并将在给定时间运行任意数量的Topology 。
  • Task

    现在您对 spouts 和 bolts 有了一个基本的了解。它们是Topology 的最小逻辑单元,Topology 是使用单个 spout 和一组Bolts 构建的。它们应该以特定顺序正确执行,以使Topology 成功运行。Storm 对每个 spout 和 bolt 的执行称为“Task”。简单来说,一个Task要么是执行一个 spout,要么是一个 bolt。在给定的时间,每个 spout 和 bolt 可以有多个实例在多个单独的线程中运行。
  • Worker

    Topology 以分布式方式在多个工作节点上运行。Storm 将Task均匀地分布在所有工作节点上。工作节点的作用是侦听作业并在新作业到达时启动或停止进程。
  • Stream Grouping

    数据流从 spout 流向 bolt,或从一个 bolt 流向另一个 bolt。Stream Grouping控制Tuple 在Topology 中的路由方式,帮助我们理解Topology 中的Tuple 流。有四个内置分组,如下所述。

    随机分组(Shuffle Grouping)

    在随机分组中,相同数量的Tuple 随机分布在所有执行Bolts 的工作人员中。下图描述了结构。
    随机分组

    字段分组(Field Grouping)

    Tuple 中具有相同值的字段被分组在一起,其余的Tuple 被保留在外面。然后,具有相同字段值的Tuple 被转发给执行Bolts 的同一个Worker。例如,如果流按字段“word”分组,那么具有相同字符串“Hello”的Tuple 将移动到同一个worker。下图显示了字段分组的工作原理。
    字段分组

    全局分组(Global Grouping)

    所有的流都可以分组并转发到一个Bolts 。此分组将源的所有实例生成的Tuple 发送到单个目标实例(具体来说,选择 ID 最低的工作人员)。
    全球分组

    所有分组(All Grouping)

    所有分组将每个Tuple 的单个副本发送到接收Bolts 的所有实例。这种分组用于向Bolts 发送信号。所有分组对于连接操作都很有用。
    所有分组