`
caizhongda
  • 浏览: 188173 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Twitter Storm的一些关键概念

 
阅读更多
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-Slides.pdf

    总的来说,Storm @Twitter是理解实时大数据处理的关键,它不仅提供了强大的实时计算框架,还展示了如何优雅地处理数据流和实现高可用性。对于想要深入了解流处理技术的IT从业者,这份PPT是宝贵的参考资料。

    细细品味Storm_Storm简介及安装

    **Storm** 是一款由BackType公司开发的分布式实时计算系统,后被Twitter收购并开源。它主要用于处理大规模的数据流,能够简单、高效、可靠地处理实时数据。Storm的核心部分采用Clojure语言编写,外围则使用Java。 *...

    Hadoop Hive HBase Spark Storm概念解释

    ### Hadoop Hive HBase Spark Storm概念详解 #### Hadoop **Hadoop** 是一个由Apache基金会开发的开源分布式系统基础架构。它通过提供一个高效、可靠且可扩展的平台来解决大数据存储与处理的需求。Hadoop的核心组件...

    Building Python Real-Time Applications with Storm - Kartik Bhatnagar.pdf.pdf

    Storm客户端的概念也被提到,并且包含了一些可选配置的讨论和总结。 第二部分深入讲解了Storm的内部结构和机制,包括各个核心组件的作用和它们之间的交互。Storm进程主要由Supervisor、Zookeeper和Storm UI组成。...

    storm_jars.zip

    Storm是一个强大的实时大数据处理框架,由Twitter开源并广泛应用于实时分析、在线机器学习、持续计算、分布式RPC等多种场景。它的核心概念是拓扑(Topology),通过定义数据流的处理逻辑,实现了高可用、可扩展的...

    Storm源码走读笔记

    Storm是一个开源的分布式实时计算系统,它是由Nathan Marz等人在Twitter工作期间开发的。Storm的主要优势在于简单、可靠、可以线性扩展到大量的机器上。它的设计目标是能简单、可靠地处理大量数据,并且可以无缝地...

    storm一个简单实例

    5. **Storm客户端**:客户端代码可能包含如何创建Topology、提交到集群、监控拓扑状态等功能,是理解Storm工作流程的关键部分。 6. **学习路径**:对于初学者,这个实例可以作为理解Storm基本概念和实践操作的起点...

    storm 从零到精通 非常实用的文件

    - 这些关键组件的故障可能会导致集群不稳定,但 Storm 设计了一些机制来减少这种影响。 - **2.4.4 Nimbus 是否是“单点故障”** - Nimbus 作为主控节点,确实存在成为单点故障的风险,但可以通过复制等方式减轻这...

    storm组件应用说明书

    1. **Zookeeper集群搭建**:Zookeeper是Storm集群中的关键组件,用于协调和管理各个节点。在安装Storm前,需要先部署Zookeeper集群,确保所有节点之间的通信稳定可靠。安装步骤包括配置Zookeeper服务器,设置集群...

    Storm实时数据处理-超清文字版.pdf

    Apache Storm是一个开源的分布式实时计算系统,由Twitter开源并贡献给社区。它的设计目标是能够处理无界数据流,即不断产生的、没有终点的数据流。与批处理系统不同,Storm保证每个消息都会被处理至少一次(at-least...

    流式计算Storm

    Bolt是Storm的另一个关键组件,它用于处理Spout产生的元组,进行数据清洗、转换、聚合等操作。Bolt可以订阅多个Spout发射的流,并可以生成新的流传递给其他Bolt。这种模型类似水处理系统,Spout像水龙头,Bolt如同水...

    Storm 简单示例

    在"Storm简单示例"中,我们通常会接触到以下几个关键概念和步骤: 1. **拓扑(Topology)**:在Storm中,拓扑是数据流处理的核心。它定义了数据如何在各个组件之间流动。一个拓扑包含多个 Bolt 和 Spout 组件,Bolt...

    Storm分布式实时计算在物联网系统中的应用.pdf

    Storm是一个强大的分布式实时流处理平台,最初由Twitter开源,并且在大数据实时处理领域广泛应用。它的设计目标是提供低延迟、高可靠性和可扩展性的实时计算服务。在物联网系统中,实时处理大量涌入的数据变得至关...

    zk-kafka-redis-storm安装

    Storm是Twitter开源的分布式实时计算系统,它可以处理无界数据流,进行连续计算。Storm保证每个消息至少被处理一次,这使得它非常适合于那些容错性要求较高的实时分析任务。与Hadoop处理批量数据不同,Storm专注于...

    论Storm分布式实时计算工具.pdf

    Storm 是一个开源的分布式实时计算系统,由Twitter开发,旨在处理大规模数据流,提供了一种简易的方法来实现可靠的、容错的消息处理。 Storm 的出现和应用背景非常明确,它弥补了现有大数据处理技术在实时计算方面...

    颠覆大数据分析 基于StormSpark等Hadoop替代技术的实时应用

    Storm是Twitter开源的分布式实时计算系统,它允许开发者进行连续的数据处理,即数据一旦进入系统,就会立即被处理并产生结果。Storm的核心概念包括:拓扑结构(Topology)、 bolt(处理组件)和spout(数据源)。...

    storm资源分享

    这个压缩包包含了两个关键资源,旨在帮助你理解和应用Storm技术。 首先,"Getting Started With Storm"是入门Storm的基础教程。这本书籍或文档详细介绍了如何设置和运行Storm集群,以及如何构建和部署流处理拓扑。...

    Apache Storm概要介绍.docx

    使用Storm的关键在于构建拓扑结构。首先定义数据来源(Spout),它负责从外部数据源接收数据。然后,定义数据处理逻辑(Bolt),Bolt可以对数据进行各种操作,如过滤、聚合等,并将处理后的数据发射到下一个Bolt或...

Global site tag (gtag.js) - Google Analytics