Storm 核心概念
Apache Storm 从一端读取实时数据的原始流,并将其传递给一系列小型处理单元,并在另一端输出处理后的/有用的信息。
下图描述了 Apache Storm 的核心概念。
现在让我们仔细看看 Apache Storm 的组件-
组件 |
说明 |
Tuple |
Tuple 是 Storm 中的主要数据结构。它是一个有序元素的列表。默认情况下,元组支持所有数据类型。通常,它被建模为一组逗号分隔值并传递给 Storm 集群。 |
Stream |
Stream 是一个无序的元组序列。 |
Spouts |
流的来源。通常,Storm 接受来自 Twitter Streaming API、Apache Kafka 队列、Kestrel 队列等原始数据源的输入数据。否则您可以编写 spout 从数据源读取数据。 "ISpout"是实现 spout 的核心接口。一些具体的接口有IRichSpout、BaseRichSpout、KafkaSpout等 |
Bolts |
螺栓是逻辑处理单元。 Spouts 将数据传递给 bolts 和 bolts 进程并产生新的输出流。 Bolt 可以执行过滤、聚合、加入、与数据源和数据库交互的操作。 Bolt 接收数据并发送到一个或多个 Bolt。 "IBolt"是实现bolts的核心接口,常用的接口有IRichBolt、IBasicBolt等 |
让我们以"Twitter 分析"的实时示例为例,看看如何在 Apache Storm 中对其进行建模。下图描述了其结构。
"Twitter 分析"的输入来自 Twitter Streaming API。Spout 将使用 Twitter Streaming API 读取用户的推文,并以元组流的形式输出。来自 Spout 的单个元组将有一个 Twitter 用户名和一个单个推文作为逗号分隔值。然后,这个元组流将转发到 Bolt,Bolt 会将推文拆分为单个单词,计算字数,并将信息持久化到配置的数据源。现在,我们可以轻松获得查询数据源的结果。
Topology
Spouts 和 bolts 连接在一起并形成一个拓扑。实时应用逻辑在 Storm 拓扑中指定。简单来说,拓扑是一个有向图,其中顶点是计算,边是数据流。
一个简单的拓扑从 spouts 开始。 Spout 将数据发送到一个或多个 Bolt。 Bolt 表示拓扑中具有最小处理逻辑的节点,并且可以将一个 bolt 的输出作为输入发送到另一个 bolt 中。
Storm 保持拓扑始终运行,直到您终止拓扑。 Apache Storm 的主要工作是运行拓扑,并将在给定时间运行任意数量的拓扑。
Tasks
现在您对 spouts 和 bolts 有了基本的了解。它们是拓扑的最小逻辑单元,拓扑是使用单个 spout 和一组 bolt 构建的。它们应该以特定顺序正确执行,以便拓扑成功运行。 Storm 对每一个 spout 和 bolt 的执行称为"任务"。简单来说,一个任务要么是一个 spout 的执行,要么是一个 bolt。在给定的时间,每个 spout 和 bolt 可以有多个实例运行多个单独的线程。
Workers
拓扑以分布式方式在多个工作节点上运行。 Storm 将任务均匀地分布在所有工作节点上。工作节点的作用是侦听作业并在新作业到达时启动或停止进程。
Stream Grouping
数据流从 spouts 流向 bolts 或从一个 bolts 流向另一个 bolts。流分组控制元组在拓扑中的路由方式,并帮助我们了解拓扑中的元组流。有四个内置分组,如下所述。
Shuffle Grouping
在 shuffle 分组中,相同数量的元组随机分布在所有执行 bolts 的 worker 中。下图描述了结构。
Field Grouping
元组中具有相同值的字段被分组在一起,其余的元组保留在外面。然后,具有相同字段值的元组被转发给执行螺栓的同一个工人。例如,如果流按字段"word"分组,则具有相同字符串"Hello"的元组将移动到同一个 worker。下图显示了字段分组的工作原理。
Global Grouping
所有流都可以分组并转发到一个螺栓。此分组将源的所有实例生成的元组发送到单个目标实例(具体而言,选择 ID 最低的工作线程)。
All Grouping
所有分组将每个元组的单个副本发送到接收螺栓的所有实例。这种分组用于向螺栓发送信号。所有分组对于连接操作都很有用。
