上一篇【storm初识】 博文链接:https://my.oschina.net/u/2342969/blog/871432数据库
本文将对storm的概念进行解释和进一步阐述,将要讲解的概念有:数组
topologies是实时处理计算的程序逻辑的程序包,一个topologies相似于一个 MapReduce 任务,MapReduce 任务是最终完成,而一个拓扑能够永远运行(只到你杀死它为止)。一个topologies是Spouts和Bolts 在storm集群中链接关系结构图。安全
后续还会有详细的在生产以及本地部署、测试、提交Topologies学习和介绍。请你们多多关注!!!负载均衡
Streams是storm中一个核心的概念,它是在分布式并行处理和建立的无限序列元组,Streams经过给流元组中字段命名来定义,默认状况下,元组能够包含整型,长整型,短整型,字节,字符串,布尔型,双精度浮点型,单精度浮点型,字节数组,也能够自定义序列化类型。异步
声明任何一个stream须要给定一个ID(非必须),单一stream,一个Spouts对应一个Bolts也是很常见。“OutputFieldsDeclarer” 接口为声明没有指定id的stream提供个简便的方法,这种状况下,stream会有一个名称为“ "default" 的默认id。流是有元组组成。分布式
后续还会有详细讲解 Tuple(元组),OutputFieldsDeclarer,元组中动态类型以及自定义序列化,请多多关注!!!wordpress
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能够作一些简单数据流传输,若是作复杂的数据流传输,须要分红多步使用多个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以及数据流的流转。
一个拓扑中典型的一步就是为每一个bolt指明接受哪一种流做为输入。 stream grouping(流群组)定义了流在bolt 任务中如何被划分。
Storm 中有8种内置流群组,也能够经过实现CustomStreamGrouping接口自定义一个流群组。
后面会有详细讲解,使用TopologyBuilder这个类构建一个拓扑,
storm保证了每一个spout发送的元组都会被成功执行,它会跟踪从每一个spout发送元组触发的消息树,当每一个元组被彻底处理完毕才算完成,每一个拓扑均有一个消息超时,若是在这个时间内,这个拓扑有一个spout元组未被处理完毕,随后storm都会从新发送这个元组。
利用storm高可用性能,当一个元组有新的元素加入和成功处理了一个有效元组时告诉storm,bolt中调用emit方法发送消息后,经过OutputCollector对象的ack方法确保消息处理完成。
后续博文会详细的解释 storm可靠性工做原理。
每一个spout或者bolt 都在集群任务中执行,每一个任务对应着一个线程,storm集群控制如何发送一个任务组到另一个任务组,经过TopologyBuilder的setSpout 和setBolt方法设置Spout 和Bolt的并行性。
拓扑在一个或多个工做进程之间执行。每一个工做进程是一个物理JVM,用于执行拓扑中任务的一部分,好比,有300个并行拓扑而且分配了50个工做进程,每一个工做进程将会执行6个任务,storm会尽可能均匀的分配到工做进程中。能够经过Config.TOPOLOGY_WORKERS 这个配置设置工做进程数执行拓扑。