Storm组件介绍

(1)Topologies 拓扑

解释:
拓扑相似一个集装箱,全部的货物都会存储在集装箱里面最后被托运走,storm里面全部的代码和文件最终会被打包在一个拓扑中,而后提交在storm集群中运行,相似于Hadoop中的一个MapReduce的做业,最大的区别在于MapReduce最终会主动中止,Storm的Topologies不会主动中止,除非你强制kill掉它

相关拓展:

TopologyBuilder : Java里面构造Topology工具类

生产模式
Config conf = new Config();
conf.setNumWorkers(20);
conf.setMaxSpoutPending(5000);
StormSubmitter.submitTopology("mytopology", conf, topology);
本地模式
import org.apache.storm.LocalCluster;
LocalCluster cluster = new LocalCluster();

(2)Streams 数据流

Stream是Storm里面的核心抽象模型,在分布式环境下一个数据流是由无限的tuple序列组成,这些经过数据源并行的源源不断的被建立出来,Stream的schema是由一个字段名标识,值类型能够是integer,long,shot,bytes,string,double,float,boolean,byte array固然咱们能够自定义序列化类型。

每一个流在声明时会被指定一惟一标识id,若是输出的流只有一个能够不用标识,默认指定的id是default


OutputFieldsDeclarer类负责输出标识
单个流声明:
declarer.declare(new Fields("single")
多个流声明:
declarer.declareStream("a", new Fields("data", "time", "countyId")
declarer.declareStream("b", new Fields("data", "time", "countyId")
declarer.declareStream("c", new Fields("data", "time", "countyId")

相关拓展:
Tuple:streams由一系列tuple组成
OutputFieldsDeclarer:用于声明流和他们的schema
Serialization:动态tuple类型和声明自定义序列化

(3)Spouts (喷嘴比喻数据源)

一个spout是由流组成的数据源在storm的拓扑里,一般状况下会读取外部的数据源
而后emit(发射)到拓扑里面,好比是kafka,MySQL或者redis等等,Spout有两种实现一种是可靠的消息实现,若是发送失败则会重试,另一种是不可靠的消息实现可能会出现消息丢失,spout能够一次声明多个数据流经过OutputFieldsDeclarer类的declareStream方法,固然前提是你的SpoutOutputCollector里的emit也是多个流

Spout里面主要的方法是nextTuple,它里面能够发射新的tuple到拓扑,或者当没有消息的时候就return,须要注意,这个方法里面不能阻塞,由于storm调用spout方法是单线程的,其余的主要方法是ack和fail,若是使用了可靠的spout,可使用ack和fail来肯定消息发送状态

相关扩展:
IRichSpout:spout类必须实现的接口
BaseRichBolt :可靠的spout有ack确保
BaseBasicBolt :不可靠的spout

(4)Bolts 业务处理单元
全部的拓扑处理都会在bolt中进行,bolt里面能够作任何etl,好比过滤,函数,聚合,链接,写入数据库系统或缓存等,一个bolt能够作简单的事件流转换,若是是复杂的流转化,每每须要多个bolt参与,这就是流计算,每一个bolt都进行一个业务逻辑处理,bolt也能够emit多个流到下游,经过declareStream方法声明输出的schema。

Bolt里面主要的方法是execute方法,每次处理一个输入的tuple,bolt里面也能够发射新的tuple使用OutputCollector类,bolt里面每处理一个tuple必须调用ack方法以便于storm知道某个tuple什么时候处理完成。Strom里面的IBasicBolt接口能够自动
调用ack。

相关拓展:
IRichBolt:bolts的通用接口
IBasicBolt:扩展的bolt接口,能够自动处理ack
OutputCollector:bolt发射tuple到下游bolt里面


(5)Stream grouping 流分组

分组定义了那个bolt能够收到上游的数据流,流分组定义了stream应该怎样在全部的bolt task中进行分区


目前storm内置8中分组接口能够知足大多数应用开发,你也能够经过 CustomStreamGrouping来自定义分组接口

(5.1)Shuffle grouping 随机的分发数据流,保证每一个bolt能够获得相等数量的tuple

(5.2)Fields grouping
在grouping中stream经过字段进行分区分发,好比按照userid分组,那么storm能保证在同一个task中收到的userid是同样的,可是在不一样的task中,他们的userid也是不同的

(5.3)Partial Key grouping
同Fields grouping相似,可是这个流分组能在数据有倾斜的状况下作负载均衡

(5.4)All grouping
全部的bolt task都会收到此分组下的消息

(5.5)Global grouping
全部的stream都会发射到多个bolt task中的其中一个

(5.6)None grouping
等同于Shuffle grouping

(5.7)Direct grouping
由生产者控制把tuple直接发送到那个消费者的bolt中,须要在代码里面控制

(5.8)Local or shuffle grouping 

若是目标bolt有一个或多个task,在一个worker工做进程中,tuple仅仅会分发
到在同一个进程的task中,分发方式相似shuffle grouping

扩展:
TopologyBuilder:使用这个类定义拓扑
InputDeclarer: 声明那些声明的流能够被指定的bolt接受

(6)Reliability 可靠性

使用ack保证,消息能够超时和重试

(7)Tasks 任务
每一个spout和bolt会执行多个task横跨整个集群,每一个task会在一个线程中执行
stream grouping定义了每一个task送到到那个下游的task中,在使用TopologyBuilder时,可经过setSpout 和 setBolt方法进行设置

(8)Workers 工做者
Topologies执行会横跨在一个或多个worker上,每一个worker是一个独立的jvm,会执行全部task里面的其中一部分task,好比一个拓扑的并行度是300而且有50个worker,那么每一个worker上会执行6个task(6个线程在worker内部),storm会确保
全部的task尽可能均衡的分布在全部worker中。

相关扩展:
设置worker数
conf..setNumWorkers(workNums);
相关文章
相关标签/搜索