Apache Storm - 核心概念

Apache Storm 从一端读取实时数据的原始流,并将其通过一系列小型处理单元,并在另一端输出处理后/有用的信息。

下图描述了 Apache Storm 的核心概念。

核心概念

现在让我们仔细看看 Apache Storm 的组件 −

组件 说明
Tuple 元组是 Storm 中的主要数据结构。 它是有序元素的列表。 默认情况下,元组支持所有数据类型。 通常,它被建模为一组逗号分隔值并传递给 Storm 集群。
Stream Stream 是一个无序的元组序列。
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 分析"的输入来自 Twitter 流 API。 Spout 将使用 Twitter 流 API 读取用户的推文,并以元组流的形式输出。 来自 spout 的单个元组将具有 twitter 用户名和单个 tweet 作为逗号分隔值。 然后,这组元组将被转发到 Bolt,Bolt 会将推文拆分为单个单词,计算字数,并将信息保存到配置的数据源中。 现在,我们可以通过查询数据源轻松获得结果。


topology

Spout 和 bolts 连接在一起并形成 topology 。 实时应用程序逻辑在 Storm topology 中指定。 简单来说,topology 是一个有向图,其中顶点是计算,边是数据流。

一个简单的 topology 结构从 spout 开始。 Spout 将数据发送到一个或多个bolt。 Bolt 表示 topology 中具有最小处理逻辑的节点,并且可以将一个 Bolt 的输出作为输入发送到另一个 Bolt。

Storm 保持 topology 始终运行,直到您终止 topology 。 Apache Storm 的主要工作是运行 topology ,并将在给定时间运行任意数量的 topology 。


任务

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


工作节点

topology 以分布式方式在多个工作节点上运行。 Storm 将任务均匀地分布在所有工作节点上。 工作节点的作用是监听作业,并在有新作业到达时启动或停止进程。


数据流分组

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

Shuffle 随机分组

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

Shuffle 随机分组

Field 字段分组

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

Field 字段分组

Global 全局分组

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

Global 全局分组

All 分组

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

All 分组