Apache Storm - 核心概念


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

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

核心理念

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

成分 描述
元组 Tuple是Storm中的主要数据结构。它是一个有序元素的列表。默认情况下,元组支持所有数据类型。通常,它被建模为一组逗号分隔值并传递到 Storm 集群。
溪流 流是无序的元组序列。
喷嘴 流的来源。一般来说,Storm 接受来自 Twitter Streaming API、Apache Kafka 队列、Kestrel 队列等原始数据源的输入数据。否则,您可以编写 spouts 从数据源读取数据。“ISpout”是实现spouts的核心接口。具体的接口有IRichSpout、BaseRichSpout、KafkaSpout等。
螺栓 Bolt 是逻辑处理单元。Spouts 将数据传递给 Bolt,然后 Bolt 进行处理并生成新的输出流。Bolt 可以执行过滤、聚合、连接、与数据源和数据库交互的操作。Bolt 接收数据并向一个或多个 Bolt 发送数据。“IBolt”是实现 Bolt 的核心接口。一些常见的接口有 IRichBolt、IBasicBolt 等。

让我们以“Twitter 分析”为例,看看如何在 Apache Storm 中对其进行建模。下图描述了该结构。

推特分析

“Twitter 分析”的输入来自 Twitter Streaming API。Spout 将使用 Twitter Streaming API 读取用户的推文并以元组流的形式输出。来自 spout 的单个元组将具有 Twitter 用户名和单个推文作为逗号分隔值。然后,这组元组将被转发到 Bolt,Bolt 会将推文拆分为单个单词,计算单词数,并将信息保存到配置的数据源。现在,我们可以通过查询数据源轻松获得结果。

拓扑结构

喷嘴和螺栓连接在一起并形成拓扑。实时应用程序逻辑在 Storm 拓扑内部指定。简而言之,拓扑是一个有向图,其中顶点是计算,边是数据流。

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

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

任务

现在您对喷嘴和螺栓有了基本的了解。它们是拓扑的最小逻辑单元,拓扑是使用单个 spout 和螺栓阵列构建的。它们应该以特定顺序正确执行,以便拓扑成功运行。Storm 对每个 spout 和 Bolt 的执行称为“任务”。简单来说,任务要么是执行 spout,要么是执行 Bolt。在给定时间,每个 Spout 和 Bolt 可以有多个实例在多个单独的线程中运行。

工人

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

码流分组

数据流从喷口流向螺栓,或者从一个螺栓流向另一个螺栓。流分组控制元组在拓扑中的路由方式,并帮助我们理解元组在拓扑中的流动。有四个内置分组,如下所述。

随机分组

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

随机分组

字段分组

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

字段分组

全球分组

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

全球分组

所有分组

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

所有分组