Apache storm——核心概念
Apache Storm reads raw stream of real-time data from one end and passes it through a sequence of small processing units and output the processed / useful information at the other end.
Apache storm从一个终端读取实时数据流,经过一系列小的处理单元处理后,输出处理过的处理信息或者有用信息到另一个终端。
下图描述了Apache storm的核心概念:
现在让我们看看Apache storm的组件:
--------- Tuple
--------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 元组Tuple是storm主要的数据结构。 这是一个有序列表元素。 默认情况下,Tuple支持所有的数据类型。 一般来说,Tuple描述的是传递给storm集群的,用逗号分隔的一系列值。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Stream --------- | Stream是一个无序的Tuple序列。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Spouts
---------- | Spouts是Stream的来源。 一般来说,Storm从如Twitter StreamAPI,Apache kafka队列,Kestrel队列等原始数据来源接受输入数据。当然你可以写spouts从指定数据源读取数据。 “ISpout”是实现spouts的核心接口。 一些特定的接口如IRichSpout、BaseRichSpout KafkaSpout等等。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Bolts
---------- | Bolts是storm的逻辑处理单元。 Spouts传递数据给bolts,经过bolts处理后产生新的输出流。 Bolts与数据源和数据库进行交互时,可以执行filtering(过滤), aggregation(聚合), joining(连接)操作。 Bolt接收数据并能够发送数据到一个或多个Bolt。 “IBolt”是实现Bolts的核心接口。 其他一些常见的接口是IRichBolt,IBasicBolt等等。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
让我们来看“Twitter Analysis”,一个实时处理数据的例子,看看它怎么样使用Apache storm。
下图描述了“Twitter Analysis”例子结构:
“Twitter Analysis”的输入来自Twitter StreamAPI。
Spout使用Twitter StreamAPI读取用户的tweet,并且作为tuples流输出。
Spout中的一个元组包含一个twitter用户名,和一个用逗号分隔的推特数据。
然后,这个tuple Stream会指向Bolt,,bolt将tweet的值分割成单个的词并,计算字数,然后将信息持久化到一个配置数据源。
最后,我们可以很容易地通过查询数据源中的数据来得到结果。
Topology
Spouts和bolts连接在一起,形成一个topology。
实时应用程序逻辑指定storm的topology。
简单的讲,一个topology是一个顶点计算,边缘为数据流的有向图,。
一个简单的topology以spouts开始。
Spout发送数据到一个或多个Bolt
Bolt代表一个topology节点中最小的逻辑处理单元,,Bolt的输出可以作为另一个Bolt的输入。
Storm维持topology一直运行,直到你停止topology。
Apache的主要任务是运行topology,并且能够在给定的时间运行任意数量的topology。
Tasks(任务)
现在你对spouts和bolts有了基本上的认识,
他们是topology中最小的逻辑处理单元,一个topology通常有一个spout和多个bolt构成。
他们在一个topology中按照一定的顺序执行以保证逻辑处理的正确和成功。
在storm中,执行的topology中的每一个spout和bolt被称为Tasks任务。
简单的说,task是被执行的每一个spout和bolt。
在给定的时间,每个spout和bolt可以运行在多个实例的多个单独的线程中。
Workers(工作节点)
一个topology以分布式的方式运行在多个工作节点上。
Storm均匀的分配任务在所有的工作节点上。
工作节点的角色是监听任务,并且在每一个新的任务到来时启动或停止处理过程。
Stream Grouping(流分租)
Storm的数据流流向是从一个spout到一个Bolt,或者是一个Bolt到另一个Bolt.
流分组控制tuple在topology按照怎样的规则传递,并帮助我们理解topology中的tuple流。
有四个内置分组,解释如下:
Shuffle Grouping
在shuffle grouping中,同等数量的tuple被随机分布到所有的bolt工作节点上执行。
下图描述了shuffle grouping的结构:
Field Grouping
在Field Grouping 中,tuple中具有相同值的字段被分在一起,剩余的tuple被则被分到其他不同的bolt上
然后,拥有相同的字段值的tuple被发送到相同的worker节点上执行Bolt处理。
例如,如果Stream按照字段“word”分组,那么具有相同字符串“Hello”的tuple就会传递到相同的worker节点上。
下面的图显示了字段分组是如何工作的:
Global Grouping
所有的流都可以进行分组并发送给一个Bolt处理。
这个分组发送元组生成的源到一个目标实例的所有实例(具体来说,选择最低的工人ID)。
这个分组将source的所有实例产生的tuple发送到一个单一的实例上(尤其是选择ID最低的worker)
All Grouping
All Grouping 发送tuple的一个副本到所有的接收Bolt实例。
这样的分组是用于发送信号到Bolts的。
All grouping对连接操作很有利。