storm从入门到放弃教程(2)--基础概念详细介绍

概述

上一篇【storm初识】 博文链接:https://my.oschina.net/u/2342969/blog/871432数据库

     本文将对storm的概念进行解释和进一步阐述,将要讲解的概念有:数组

  1. Topologies (拓扑)
  2. Streams (数据流)
  3. Spouts (发射器,瀑布)
  4. Bolts ( 闪电 ,处理者)
  5. Stream groupings (流群组)
  6. Reliability (可靠性)
  7. Tasks (任务)
  8. Workers (角色,工做者)

名词解释

Topologies (拓扑)

     topologies是实时处理计算的程序逻辑的程序包,一个topologies相似于一个 MapReduce  任务,MapReduce  任务是最终完成,而一个拓扑能够永远运行(只到你杀死它为止)。一个topologies是Spouts和Bolts 在storm集群中链接关系结构图。安全

      后续还会有详细的在生产以及本地部署、测试、提交Topologies学习和介绍。请你们多多关注!!!负载均衡

Streams (数据流)

    Streams是storm中一个核心的概念,它是在分布式并行处理和建立的无限序列元组,Streams经过给流元组中字段命名来定义,默认状况下,元组能够包含整型,长整型,短整型,字节,字符串,布尔型,双精度浮点型,单精度浮点型,字节数组,也能够自定义序列化类型。异步

     声明任何一个stream须要给定一个ID(非必须),单一stream,一个Spouts对应一个Bolts也是很常见。“OutputFieldsDeclarer” 接口为声明没有指定id的stream提供个简便的方法,这种状况下,stream会有一个名称为“ "default"  的默认id。流是有元组组成。分布式

     后续还会有详细讲解 Tuple(元组),OutputFieldsDeclarer,元组中动态类型以及自定义序列化,请多多关注!!!wordpress

Spouts (发射器,瀑布)

    Spouts是一个拓扑中stream(数据流)的源头,一般状况下,Spouts从其余应用源(消息等数据载体)读取 tuples(元组) ,发送到拓扑中,spouts能够是可靠或不可靠二者之一,当一个 tuples(元组)被storm处理失败时, 可靠的Spouts将自动从新发送,不可靠的Spouts会丢弃。性能

    Spouts能够发送不止一个数据流,当使用SpoutOutputCollector的emit方法发送时,能够经过OutputFieldsDeclarer的declareStream方法声明多个Stream(数据流)和指定数据流进行发送。学习

     Spouts  中有个重要的方法--nextTuple。nextTuple方法能够发送一个新的Tuple(元组)到拓扑,若是没有新的元组须要发送,则会直接返回。nextTuple方法不会影响任何Spouts 的实现,因此storm能够在相同的线程内调用全部spout方法。测试

    Spouts  中还有另外两个重要的方法--ack 和 fail,storm发现一个spout发送Tuple(元组)彻底成功或者失败是就会调用,这两个方法只会被可靠Spouts调用。

    后续还会有详细讲解  如何声明Spouts以及 Spouts   如何有效的处理消息,请多多关注!!!

 Bolts ( 闪电 ,处理者)

    拓扑中的全部处理工做都在bolts中执行,bolts能够作过滤,功能,计算,合并,数据库交互等等处理元组的操做。

    bolts能够作一些简单数据流传输,若是作复杂的数据流传输,须要分红多步使用多个bolt。好比,转移一个流为统计图至少须要两步:一个bolt为没一个统计图循环汇总统计数据,在生成某个统计图前须要一个或者多个bolt进行转换(多个比一个的伸缩性更强)。

     bolts 能够发送不止一个数据流,当使用OutputCollector的emit方法发送时,能够经过OutputFieldsDeclarer的declareStream方法声明多个Stream(数据流)和指定数据流进行发送。

      当声明一个bolt的输入流时,就须要订阅特定数据流的另外一个组件。若是须要订阅另外一个组件的全部数据流,就必须一个一个订阅。InputDeclarer有个简便的语法,能够在默认stream ID上订阅这个数据流。好比,declarer.shuffleGrouping("1") 和 declarer.shuffleGrouping("1", DEFAULT_STREAM_ID) 语法同样,均是订阅组件“1”上的默认stream id。

    bolts  还有一个重要的execute方法,它能够将处理好新元组发送给OutputCollector。在execute方法中,bolts 应当为每一个元组调用OutputCollector的ack方法,以便storms确保每一个元组都能正确的执行完成。最多见的场景是,基于一个元组发送0个或者多个元组,而后接收新的输入元组,bolts提供了一个IBasicBolt  接口自动接收。

    bolts能够很好的启用新线程进行异步处理,OutputCollector在任什么时候候都是线程安全的。

后续还会有详细讲解  通用接口--IRichBolt,基本接口-- IBasicBolt ,元组发射类--OutputCollector以及数据流的流转。

Stream groupings (流群组)

     一个拓扑中典型的一步就是为每一个bolt指明接受哪一种流做为输入。 stream grouping(流群组)定义了流在bolt 任务中如何被划分。

     Storm  中有8种内置流群组,也能够经过实现CustomStreamGrouping接口自定义一个流群组。

  1. 随机分组:元组随机的分布到各个bolt任务中,保证每一个bolt处理同等数量的元组。
  2. 字段分组:根据指定字段对数据流切割分组,好比,在数据流中根据“user-id”字段分组,具备相同“user-id”字段的元组会被分到同一个任务中,不一样于“user-id”字段的元组会被分到其余任务中。
  3. 侧重分组:和字段分组分组相似,根据指定字段对数据流分组,不一样的是,它对下游的bolt作了负载均衡,当传入的数据倾斜时(不均衡),它能够更好的利用资源,这个文档很好的解释了它是如何更好的工做的。若有须要另起一篇关于它的详细工做原理的,能够经过评论提出。
  4. 全分组:数据流将分配到全部bolt的任务中,这个分组慎用。
  5. 全局分组:全部的流被分配到bolt其中一个任务,特别之处,它会分配到ID最小的bolt。
  6. 无分组:这种分组就是不用关心数据流是如何分组的,通常来讲,无分组至关于随机分组,不过, Storm  将会在同一个线程中推送无分组的bolt给订阅了的bolt或者spout。
  7. 直接分组:这是一种特殊的分组,采用这种方式意味着,元组生产者直接决定了哪一个元组消费者直接接收。该分组只能被定义为直接流的所使用,元组发送只能使用emitDirect方法,bolt能够经过提供的TopologyContext或者OutputCollector的emit方法的输出流(元组发送完毕后返回任务id)获得任务id.
  8. 本地 或 随机分组:若是目标bolt在同一个工做进程内有一个或多个任务时,元组会打乱工做进程内的任务,这机制就像一个正常的随机分组似的。

后面会有详细讲解,使用TopologyBuilder这个类构建一个拓扑,

   Reliability (可靠性)

     storm保证了每一个spout发送的元组都会被成功执行,它会跟踪从每一个spout发送元组触发的消息树,当每一个元组被彻底处理完毕才算完成,每一个拓扑均有一个消息超时,若是在这个时间内,这个拓扑有一个spout元组未被处理完毕,随后storm都会从新发送这个元组。

       利用storm高可用性能,当一个元组有新的元素加入和成功处理了一个有效元组时告诉storm,bolt中调用emit方法发送消息后,经过OutputCollector对象的ack方法确保消息处理完成。

后续博文会详细的解释 storm可靠性工做原理。

Tasks (任务)

     每一个spout或者bolt 都在集群任务中执行,每一个任务对应着一个线程,storm集群控制如何发送一个任务组到另一个任务组,经过TopologyBuilder的setSpout 和setBolt方法设置Spout 和Bolt的并行性。

Workers (角色,工做者)

     拓扑在一个或多个工做进程之间执行。每一个工做进程是一个物理JVM,用于执行拓扑中任务的一部分,好比,有300个并行拓扑而且分配了50个工做进程,每一个工做进程将会执行6个任务,storm会尽可能均匀的分配到工做进程中。能够经过Config.TOPOLOGY_WORKERS 这个配置设置工做进程数执行拓扑。

相关文章
相关标签/搜索