Twitter Storm的一些关键概念
这篇文章翻译自storm官方wiki: https://github.com/nathanmarz/storm/wiki/Concepts, 主要介绍storm的一些关键概念。
storm的一些关键概念如下:
Topologies
Streams
Spouts
Bolts
Stream groupings
Reliability
Tasks
Workers
Configuration
先看一张storm里面各种对象的一个示意图:
storm里面各个对象的示意图
计算拓补: Topologies
一个实时计算应用程序的逻辑在storm里面被封装到topology对象里面, 我把它叫做计算拓补. Storm里面的topology相当于Hadoop里面的一个MapReduce Job, 它们的关键区别是:一个MapReduce Job最终总是会结束的, 然而一个storm的topoloy会一直运行 — 除非你显式的杀死它。 一个Topology是Spouts和Bolts组成的图状结构, 而链接Spouts和Bolts的则是Stream groupings。
消息流: Streams
消息流是storm里面的最关键的抽象。一个消息流是一个没有边界的tuple序列, 而这些tuples会被以一种分布式的方式并行地创建和处理。 对消息流的定义主要是对消息流里面的tuple的定义, 我们会给tuple里的每个字段一个名字。 并且不同tuple的对应字段的类型必须一样。 也就是说: 两个tuple的第一个字段的类型必须一样, 第二个字段的类型必须一样, 但是第一个字段和第二个字段可以有不同的类型。 在默认的情况下, tuple的字段类型可以是: integer, long, short, byte, string, double, float, boolean和byte array。 你还可以自定义类型 — 只要你实现对应的序列化器。
每个消息流在定义的时候会被分配给一个id, 因为单向消息流是那么的普遍, OutputFieldsDeclarer定义了一些方法让你可以定义一个stream而不用指定这个id。在这种情况下这个stream会有个默认的id: 1.
消息源: Spouts
消息源Spouts是storm里面一个topology里面的消息生产者。一般来说消息源会从一个外部源读取数据并且向topology里面发出消息: tuple。 消息源Spouts可以是可靠的也可以是不可靠的。一个可靠的消息源可以重新发射一个tuple如果这个tuple没有被storm成功的处理, 但是一个不可靠的消息源Spouts一旦发出一个tuple就把它彻底忘了 — 也就不可能再发了。
消息源可以发射多条消息流stream。要达到这样的效果, 使用OutFieldsDeclarer.declareStream来定义多个stream, 然后使用SpoutOutputCollector来发射指定的sream。
Spout类里面最重要的方法是nextTuple要么发射一个新的tuple到topology里面或者简单的返回如果已经没有新的tuple了。要注意的是nextTuple方法不能block Spout的实现, 因为storm在同一个线程上面调用所有消息源Spout的方法。
另外两个比较重要的Spout方法是ack和fail。storm在检测到一个tuple被整个topology成功处理的时候调用ack, 否则调用fail。storm只对可靠的spout调用ack和fail。
消息处理者: Bolts
所有的消息处理逻辑被封装在bolts里面。 Bolts可以做很多事情: 过滤, 聚合, 查询数据库等等等等。
Bolts可以简单的做消息流的传递。复杂的消息流处理往往需要很多步骤, 从而也就需要经过很多Bolts。比如算出一堆图片里面被转发最多的图片就至少需要两步: 第一步算出每个图片的转发数量。第二步找出转发最多的前10个图片。(如果要把这个过程做得更具有扩展性那么可能需要更多的步骤)。
Bolts可以发射多条消息流, 使用OutputFieldsDeclarer.declareStream定义stream, 使用OutputCollector.emit来选择要发射的stream。
Bolts的主要方法是execute, 它以一个tuple作为输入,Bolts使用OutputCollector来发射tuple, Bolts必须要为它处理的每一个tuple调用OutputCollector的ack方法,以通知storm这个tuple被处理完成了。– 从而我们通知这个tuple的发射者Spouts。 一般的流程是: Bolts处理一个输入tuple, 发射0个或者多个tuple, 然后调用ack通知storm自己已经处理过这个tuple了。storm提供了一个IBasicBolt会自动调用ack。
Stream groupings: 消息分发策略
定义一个Topology的其中一步是定义每个bolt接受什么样的流作为输入。stream grouping就是用来定义一个stream应该如果分配给Bolts上面的多个Tasks。
storm里面有6种类型的stream grouping:
Shuffle Grouping: 随机分组, 随机派发stream里面的tuple, 保证每个bolt接收到的tuple数目相同。
Fields Grouping:按字段分组, 比如按userid来分组, 具有同样userid的tuple会被分到相同的Bolts, 而不同的userid则会被分配到不同的Bolts。
All Grouping: 广播发送, 对于每一个tuple, 所有的Bolts都会收到。
Global Grouping: 全局分组, 这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
Non Grouping: 不分组, 这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
Direct Grouping: 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。 只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来或者处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)
可靠性
storm保证每个tuple会被topology完整的执行。storm会追踪由每个spout tuple所产生的tuple树(一个bolt处理一个tuple之后可能会发射别的tuple从而可以形成树状结构), 并且跟踪这棵tuple树什么时候成功处理完。每个topology都有一个消息超时的设置, 如果storm在这个超时的时间内检测不到某个tuple树到底有没有执行成功, 那么topology会把这个tuple标记为执行失败,并且过一会会重新发射这个tuple。
为了利用storm的可靠性特性,在你发出一个新的tuple以及你完成处理一个tuple的时候你必须要通知storm。这一切是由OutputCollector来完成的。通过它的emit方法来通知一个新的tuple产生了, 通过它的ack方法通知一个tuple处理完成了。
Tasks: 任务
每一个Spout和Bolt会被当作很多task在整个集群里面执行。每一个task对应到一个线程,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。你可以调用TopologyBuilder.setSpout()和TopBuilder.setBolt来设置并行度 — 也就是有多少个task。
工作进程
一个topology可能会在一个或者多个工作进程里面执行,每个工作进程执行整个topology的一部分。比如对于并行度是300的topology来说,如果我们使用50个工作进程来执行,那么每个工作进程会处理其中的6个tasks(其实就是每个工作进程里面分配6个线程)。storm会尽量均匀的工作分配给所有的工作进程。
配置
storm里面有一堆参数可以配置来调整nimbus, supervisor以及正在运行的topology的行为, 一些配置是系统级别的, 一些配置是topology级别的。所有有默认值的配置的默认配置是配置在default.xml里面的。你可以通过定义个storm.xml在你的classpath厘米来覆盖这些默认配置。并且你也可以在代码里面设置一些topology相关的配置信息 – 使用StormSubmitter。当然,这些配置的优先级是: default.xml < storm.xml < TOPOLOGY-SPECIFIC配置。
.from: http://xumingming.sinaapp.com/117/twitter-storm的一些关键概念/
- 大小: 201.6 KB
分享到:
相关推荐
总的来说,Storm @Twitter是理解实时大数据处理的关键,它不仅提供了强大的实时计算框架,还展示了如何优雅地处理数据流和实现高可用性。对于想要深入了解流处理技术的IT从业者,这份PPT是宝贵的参考资料。
**Storm** 是一款由BackType公司开发的分布式实时计算系统,后被Twitter收购并开源。它主要用于处理大规模的数据流,能够简单、高效、可靠地处理实时数据。Storm的核心部分采用Clojure语言编写,外围则使用Java。 *...
### Hadoop Hive HBase Spark Storm概念详解 #### Hadoop **Hadoop** 是一个由Apache基金会开发的开源分布式系统基础架构。它通过提供一个高效、可靠且可扩展的平台来解决大数据存储与处理的需求。Hadoop的核心组件...
Storm客户端的概念也被提到,并且包含了一些可选配置的讨论和总结。 第二部分深入讲解了Storm的内部结构和机制,包括各个核心组件的作用和它们之间的交互。Storm进程主要由Supervisor、Zookeeper和Storm UI组成。...
Storm是一个强大的实时大数据处理框架,由Twitter开源并广泛应用于实时分析、在线机器学习、持续计算、分布式RPC等多种场景。它的核心概念是拓扑(Topology),通过定义数据流的处理逻辑,实现了高可用、可扩展的...
Storm是一个开源的分布式实时计算系统,它是由Nathan Marz等人在Twitter工作期间开发的。Storm的主要优势在于简单、可靠、可以线性扩展到大量的机器上。它的设计目标是能简单、可靠地处理大量数据,并且可以无缝地...
5. **Storm客户端**:客户端代码可能包含如何创建Topology、提交到集群、监控拓扑状态等功能,是理解Storm工作流程的关键部分。 6. **学习路径**:对于初学者,这个实例可以作为理解Storm基本概念和实践操作的起点...
- 这些关键组件的故障可能会导致集群不稳定,但 Storm 设计了一些机制来减少这种影响。 - **2.4.4 Nimbus 是否是“单点故障”** - Nimbus 作为主控节点,确实存在成为单点故障的风险,但可以通过复制等方式减轻这...
1. **Zookeeper集群搭建**:Zookeeper是Storm集群中的关键组件,用于协调和管理各个节点。在安装Storm前,需要先部署Zookeeper集群,确保所有节点之间的通信稳定可靠。安装步骤包括配置Zookeeper服务器,设置集群...
Apache Storm是一个开源的分布式实时计算系统,由Twitter开源并贡献给社区。它的设计目标是能够处理无界数据流,即不断产生的、没有终点的数据流。与批处理系统不同,Storm保证每个消息都会被处理至少一次(at-least...
Bolt是Storm的另一个关键组件,它用于处理Spout产生的元组,进行数据清洗、转换、聚合等操作。Bolt可以订阅多个Spout发射的流,并可以生成新的流传递给其他Bolt。这种模型类似水处理系统,Spout像水龙头,Bolt如同水...
在"Storm简单示例"中,我们通常会接触到以下几个关键概念和步骤: 1. **拓扑(Topology)**:在Storm中,拓扑是数据流处理的核心。它定义了数据如何在各个组件之间流动。一个拓扑包含多个 Bolt 和 Spout 组件,Bolt...
Storm是一个强大的分布式实时流处理平台,最初由Twitter开源,并且在大数据实时处理领域广泛应用。它的设计目标是提供低延迟、高可靠性和可扩展性的实时计算服务。在物联网系统中,实时处理大量涌入的数据变得至关...
Storm是Twitter开源的分布式实时计算系统,它可以处理无界数据流,进行连续计算。Storm保证每个消息至少被处理一次,这使得它非常适合于那些容错性要求较高的实时分析任务。与Hadoop处理批量数据不同,Storm专注于...
Storm 是一个开源的分布式实时计算系统,由Twitter开发,旨在处理大规模数据流,提供了一种简易的方法来实现可靠的、容错的消息处理。 Storm 的出现和应用背景非常明确,它弥补了现有大数据处理技术在实时计算方面...
Storm是Twitter开源的分布式实时计算系统,它允许开发者进行连续的数据处理,即数据一旦进入系统,就会立即被处理并产生结果。Storm的核心概念包括:拓扑结构(Topology)、 bolt(处理组件)和spout(数据源)。...
这个压缩包包含了两个关键资源,旨在帮助你理解和应用Storm技术。 首先,"Getting Started With Storm"是入门Storm的基础教程。这本书籍或文档详细介绍了如何设置和运行Storm集群,以及如何构建和部署流处理拓扑。...
使用Storm的关键在于构建拓扑结构。首先定义数据来源(Spout),它负责从外部数据源接收数据。然后,定义数据处理逻辑(Bolt),Bolt可以对数据进行各种操作,如过滤、聚合等,并将处理后的数据发射到下一个Bolt或...