原文:http://storm.apache.org/documentation/Concepts.html html
这个列表展现了storm中的主要概念和相关详细信息。这些概念是:java
Topologies数据库
Streamsapache
Spoutsapi
Bolts安全
Stream groupings异步
Reliability分布式
Tasksui
Worksspa
实时处理逻辑被包含在一个storm topology中。一个storm topology 与MapReduce job类似。其中一个关键不一样是MapReduce job最终会中止,可是topology会一直运行(除非你kill它)。一个topology是一系列经过数据流链接起来的spout和bolt。下面将描述这些概念。
更多资源:
TopologyBuilder:在Java程序中,使用这个类构建topology
Running topologies on a production cluster(在集群上运行topology)
Local mode:如何在本地开发和调试topology
Stream是storm的核心抽象。Stream是经过分布式方式平行创造出的一个无限制的tuples队列。Stream要为tuples中的fields(属性)命名。在默认状况下,tuples中能够有integers,longs,shorts,bytes,Strings,doubles,floats,booleans和byte arrays。固然,你也能够在tuples中使用自定义序列化(serializers)类型。
每个Stream在声明时都会给一个id。由于单一流的spouts和bolts很是常见,OutputFieldsDeclarer有很是方便的方法声明一个没有指定id的流。在这种状况下,这个流被给定了一个默认id:“default”
更多资源:
Tuple:stream是由tuples组成的。
OutputFieldsDeclarer:用来声明一个流
Serialization:tuples的动态类型信息并声明自定义序列换类型
ISerialization:自定义序列换类型必须实现的接口
CONFIG.TOPOLOGY_SERIALIZATIONS:自定义序列换类型能够经过这个配置进行
Spout是storm中流的源头。一般的spouts从外部数据源中读取数据而后向topology中发射。Spout分为可重发(reliable)和非可重发(unreliable)两种。一个可重发的spout会在storm处理失败后再次发送处理失败的tuple,而非可重发的spout在发射完一个tuple以后就再也不关注后续处理。
Spout能够发射多条Stream。可使用OutputFieldsDeclarer中的declareStream方法声明多个Stream,并在使用时经过SpoutOutputCollector的emit方法发射数据。
Spout中最主要的方法是nextTuple。nextTuple能够向topology发射数据或在没有数据要发射的时候返回。在spout实现类中没有必要给nextTuple加锁,由于storm会在同一个线程中调用全部的spout方法。
其余两个重要的方法是ack和fail。当storm发现从spout发射出的tuple在整个topology过程当中处理成功或失败时,会调用响应的ack或fail方法。只有在可重发的spout中才会调用ack或fail方法。
更多资源:
IRichSpout:全部spout必须实现的接口
Guaranteeing message processing(保证消息处理机制)
Topologies中的全部处理过程都是在bolts中完成的。Bolts经过过滤(filtering)、方法(function)、聚合(aggregation)、链接(joins)、访问数据库等方式作任意数据操做。
Bolts能够作简单的Stream转换。可是作复杂的Stream转换须要在更多的bolt中执行多个步骤。举例来讲:讲一个tweet Stream转换为一个热门图片Stream至少须要两个步骤:一个bolt统计每一个图片的关注者(retweets),另外一个bolt算出前几名的图片(你能够用更加可拓展的方式处理这个数据Stream转换,好比使用3个bolt)
bolts能够发射多条Stream。可使用OutputFieldsDeclarer中的declareStream方法声明多个Stream,并在使用时经过SpoutOutputCollector的emit方法发射数据。
当你在bolt中声明了一个输入Stream,就意味着bolt从另外一个组件(component)上订阅了一个特定的Stream。若是你但愿订阅另外一个组件上的全部流,须要分别声明订阅。InputDeclarer提供了一个经过默认Stream id订阅流的方法。好比declarer.shuffleGrouping("1")
表示你从组件1上订阅了默认流,至关于declarer.shuffleGrouping("1", DEFAULT_STREAM_ID)
.
Bolt中的主方法是execute
,每从输入Stream中读取数据时会调用它。Bolts经过OutputCollector发射新的tuples。Bolts须要在OutputCollector发射每一个tuple完成以后调用ack方法,以便于storm知道tuple何时完成(能够最终确认原始spout发射的tuple是处理成功的)。一般状况下,tuple每处理一个输入tuple,会在输入tuple的基础上发射0或多个tuples,而后ack输入tuple,storm提供了一个接口IBasicBolt能够自动的调用ack方法。
在bolts中启动多个线程进行异步处理数据是一个完美的方法。OutputCollector是线程安全的,而且能够随时调用。
更多资料:
IRichBolt: bolts实现的基础接口
IBasicBolt:一个便利的接口,具有过滤功能和简单方法
OutputCollector:bolts用来向输出steam发射tuples的实例。
Guaranteeing message processing(保证消息处理机制)
定义在topology中,每一个bolt选择哪一个Stream做为输入。一个Stream grouping定义了Stream在多个bolt’s tasks中如何分配。
在storm中有7种内置的Stream grouping方式,你能够经过实现CustomStreamGrouping接口来建立本身的Stream grouping。
Shuffle grouping: Tuples被随机分配到每个bolt’s task,以便于每个bolt’s task得到相同数量的tuples。
Fields grouping: Stream被根据属性(fields)进行分组。举例:若是一个Stream根据“user-id”分组,具备相同“user-id”属性的tuples会被发往同一个bolt’s task,具备不一样“user-id”的tuples有可能发往不一样的bolt’s task。
All grouping:Stream会被重复的发往每个bolt’s task,使用这个方式须要慎重。
Global grouping:输入流会发往bolt’s tasks中的一个。具体来讲,会发往最小id的task
None grouping:这种方式表示你并不关心Stream如何分组。当前版本中,它的效果等同于shuffle grouping。Eventually though, Storm will push down bolts with none groupings to execute in the same thread as the bolt or spout they subscribe from (when possible).
Direct grouping:这是一个特殊的grouping。这种方式可让tuple的生产者决定消费者中哪个task可以接收这个tuple。只有当一个Stream声明是一个direct stream时,Direct grouping方式才能生效。必须使用[emitDirect](/apidocs/backtype/storm/task/OutputCollector.html#emitDirect(int, int, java.util.List)方法,才能将tuple发送到一个direct Stream中。一个bolt能够经过两种方式获取到消费者的taskid,一种是使用TopologyContext获取,另外一种是经过跟踪OutputCollector中的emit方法的返回值(当tuples发送以后,会返回task ids)
Local or shuffle grouping:若是目标bolt在一个worker进程中有多个或一个tasks,tuples会随机发送到进程内的tasks。不然,这种方式与shuffle grouping相同。
相关资料
TopologyBuilder:用来建立topology的类
InputDeclarer:这个对象在调用TopologyBuilder类的setBolt
方法时返回,用来声明一个bolt的输入Stream和这些Stream用什么样的grouping方式。
CoordinatedBolt:这个bolt用于分布式RPC topologies,并大量使用direct Stream和direct groupings。
Storm确保没有个spout发出的tuple将会被topology完整的处理。经过创建一颗树来跟踪spout发出的每个tuple,并且决定tuple有多长时间处理完毕。每个topology有一个“message timeout”配置这个时间。若是storm发现tuple在这个时间内没有完成这棵树,那么这个tuple就是fail,并从新处理这个tuple。
为了很好的利用storm的可靠性机制,你必须告知storm何时在监控树上建立了一个新的路径,并在何时完成了一个tuple的处理。这些在bolts使用OutputCollector发送完tuple时要作的。在肯定完成了emit方法以后,必须调用ack方法来告知处理了这个tuple。
更多信息在Guaranteeing message processing.
每个spout或bolt在集群中运行多个tasks。每个task至关于程序中的一个线程,Stream grouping定义了如何将tuples从一个task集合到另外一个task集合。你能够为每个spout或bolt在类中TopologyBuilder的setSpout
或setBolt
方法
设置平行度(parallelism)。
Topologies执行一个或多个worker进程。每一个worker进程是一个运行task子集的物理虚拟机。举例:若是一个topology一共有300个tasks和50个workers,那么每个worker执行6个tasks。Storm尝试将tasks平均的分配到每个worker。
相关资料:
Config.TOPOLOGY_WORKERS:执行topology的worker数量