Twitter Storm 概念
精选 翻译MichaelChenl 博主文章分类:twitter storm
这个页面列出了storm的主要概念和查找更多信息的链接。讨论的概述有:
1. 拓扑(Topologies)
2. 流(Streams)
3. 喷嘴(Spouts)
4. 螺栓(Bolts)
5. 流分组(Stream groupings)
6. 可靠性(Reliability)
7. 任务(Tasks)
8. 工作者(Workers)
9. 配置(Configuration)
Topologies
实时应用的逻辑被打包在storm拓扑里。storm拓扑类似于MapReduce job。一个关键的区别是MapReduce job运行一段时间后最终会完成,而storm拓扑一直运行(直到你kill它)。一个拓扑是由spouts和bolts组成的图,spouts和bolts之间通过流分组连接起来。下面描述了这些概念。
TopologyBuilder:用java语言,使用这个类来构造拓扑。
本地模式:学习在本地模式如何开发和测试拓扑。
Streams
Storm核心的抽象概念是“流”。流是一个分布式并行创建和处理的×××的连续元组(tuple)。流通过一种模式来定义,该模式是给流元组中字段命名。默认情况下,元组可以包含整型、长整型、短整型、字节、字符串、双精度浮点数、单精度浮点数、布尔型和字节数组。您还可以自定义序列化,在元组中使用自定义类型。
在声明流时,每个流被分配一个ID,由于由spouts和bolts组成的单流如此普遍,OutputFieldDeclarer提供便利的方法声明一个不需要指定ID的单流,此时,流被分配一个默认ID为“default”。
元组:流由元组组成
OutputFieldDeclarer:用于声明流及其模式
序列化:关于storm元组的动态定型和自定义序列化方面的信息
ISerialization:自定义序列化必须实现此接口
CONFIG.TOPOLOGY_SERIALIZATIONS:使用该配置注册自定义序列化
Spouts
Spout是拓扑中流的源泉。通常spouts从外部资源读取元组,然后发射元组到拓扑中(例如,Kestrel队列或Twitter API)。Spouts即可以是可靠的,也可是不可靠的。可靠的spout可以重新执行一个失败元组,但一个不可靠的spout一发射元组就会忘记它。
Spouts可以发射多个流。要发射多个流,使用OutputFieldDeclarer的declareStream方法声明多个流,并在使用SpoutOutputCollector的emit方法时指定流ID。
Spouts的重要方法是nextTuple方法。nextTuple方法发射一个新的元组到拓扑,或如果没有新的元组发射,简单的返回。注意任务spout的nextTuple方法都不要实现成阻塞的,因为storm是在相同的线程中调用spout的方法。
Spout的另外两个重要方法是ack和fail方法。当spout发射的元组被拓扑成功处理时,调用ack方法;当处理失败时,调用fail方法。Ack和fail方法仅被可靠spouts调用。更多信息参见the Javadoc。
资料:
IRichSpout:spout必须实现的接口
拓扑中的所有处理都在bolts中完成。Bolts什么都可以做,如过滤、业务功能、聚合、连接(合并)、访问数据库等等。
Bolts可以做简单的流转换。复杂的流转换经常需要多步完成,因此也需要多个bolts。例如,转换tweets数据流到流行图片数据流至少需要两步:一个bolt 对retweets的图片进行滚动计数,另外的bolt找出Top X(前几位)的图片(你可以用更具伸缩性的方式处理这部分流)。
Bolts可以发射多个流。要发射多个流,使用OutputFieldDeclarer的declareStream方法声明多个流,并在使用SpoutOutputCollector的emit方法时指定流ID。
当你声明一个bolt的输入流时,你总是以另一个组件的指定流作为输入。如果你想订阅另一个组件的所有流,你必须分别订阅每一个流。InputDeclarer提供了使用默认流ID订阅流的语法糖,调用declarer.shuffleGrouping(“1”)订阅组件“1”上的默认流,作用等同于declarer.shuffleGrouping(“1”, DEFAULT_STREAM_ID)。
Bolts的主要方法是execute方法,任务在一个新的元组输入时执行该方法。Bolts使用OutputCollector对象发射新的元组。Bolts必须对每个处理的元组调用OutputCollector的ack方法,因此storm知道这个元组完成处理(并且能最终确定ack原始元组是安全的)。一般情况,处理一个输入元组,基于此元组再发射0-N个元组,然后ack输入元组。Strom提供了一个IBasicBolt接口自动调用ack方法。
在Bolts中载入新的线程进行异步处理。OutputCollector是线程安全的,并随时都可调用它。
IRichBolt:bolt的接口
IBasicBolt:为定义用于过滤和简单功能的bolt 提供了方便接口
OutputCollector:bolts使用此类的实例发射元组到输出流。
Stream groupings
指定每个bolt应接收的输入流是定义bolts的一部分工作。流分组定义流应该如何分割到各个任务。
Storm包括六种流分组类型:
1. 随机分组(Shuffle grouping):随机分发元组到bolt的任务,保证每个任务获得相等数量的元组。
2. 字段分组(Fields grouping):根据指定字段分割数据流,并分组。例如,根据“user-id”字段,相同“user-id”的元组总是分发到同一个任务,不同“user-id”的元组可能分发到不同的任务。
3. 全部分组(All grouping):元组被复制到bolt的所有任务。小心使用该分组。
4. 全局分组(Global grouping):全部流都分配到bolt的同一个任务,明确地说,是分配给ID最小的那个task。
5. 无分组(None grouping):你不需要关心流是如何分组。目前,无分组等效于随机分组。但最终,storm将把无分组的bolts放到bolts或spouts订阅它们的同一线程去执行(如果可能)。
6. 直接分组(Direct grouping):这是一个特别的分组类型。元组生产者决定元组由哪个元组消费者任务接收。该分组仅能被声明为direct stream的流使用。元组必须通过emitDirect方法直接发射。Bolt获取消费者任务id,可以使用已提供的TopologyContext或保持引用OutputCollector的emit方法的输出(元组发送后返回的任务ID列表)。
资料:
TopologyBuilder:使用这个类定义拓扑
InputDeclarer:每当调用TopologyBuilder的setBolt方法时,返回这个对象,它用于声明一个拓扑的输入流和声明输入流如何分组。
CoordinatedBolt:该bolt用于分布式RPC拓扑,并大量使用direct stream和直接分组。
Reliability
Storm保证每个元组都被拓扑完全执行。它会追踪每个spout元组引发的元组树并检测元组树何时成功完成处理。每个拓扑都关联一个“message timeout”,如果storm检测到未在超时时间之内完成spout元组的处理,那么storm记录元组失败,并稍后重做该元组。
为了充分利用storm的可靠性特性,你必须通知storm何时发射了一个新元组,何时完成了一个元组,这些都可使用发射元组的bolt的OutputCollector对象完成,用emit方法通知storm发射了新元组,用ack方法知道storm元组已完成。
更多详情请参见可靠消息处理。
Tasks
每个spout或bolt都是作为集群中的许多任务来执行。每个任务相当于一个执行线程,流分组定义从一组任务到另一组任务如何发送元组。你可以使用TopologyBuilder的setSpout方法和setBolt方法为每个spout或bolt设置并行数。
Workers
拓扑执行时可能跨一个或多个工作者进程。每个工作者进程是一个物理JAVA虚拟机,并执行拓扑的一部分任务。例如,假如分配给拓扑的并行数为300,工作者进程为50,那么每个工作者进程执行6个任务(工作者进程中的线程)。Storm试图在所有工作者进程间均匀分布任务。
资料:
Config.TOPOLOGY_WORKERS:该配置设置执行拓扑的工作者进程数量
Configuration
Storm有各种配置调整nimbus、supervisor、运行拓扑的行为。一些配置是系统配置,不能在拓扑上进行修改,而其它配置每个拓扑都能修改。
在storm代码库的default.yaml文件中,每个配置都定义了一个默认值。通过在nimbus和supervisor的CLASSPATH中定义一个storm.yaml文件,你能覆写这些配置。最后,当使用StormSubmitter提交你的拓扑时,你可以定义一个特定的拓扑配置。
配置的优先顺序是defaults.yaml < storm.yaml < 拓扑特有配置。不过,拓扑特有配置仅能覆写前缀为“TOPOLOGY”的配置。
资料:
Config:所有配置的清单,也是一个用于创建拓扑特有配置的帮助类
default.yaml:所有配置的默认值
安装storm集群:说明如何创建和配置集群
在生产集群运行拓扑:在集群运行拓扑时有用的配置
本地模式:本地模式时有用的配置
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
集群概念解析 Lvs概念解析
集群概念解析 LVS概念解析 LVS-NAT LVS-DR
服务器 集群 LVS -
内存架构概念(oracle)
内存架构概念(oracle)
数据库 缓存 高速缓存 -
Twitter Storm: DRPC学习
Storm里面
java ide apache