非事务相关接口   IRichSpout IBasicBolt IRichBolt

 

事务相关接口 IRichStateSpout ItridentBathSpout ITransactionSpout IOpaquePartitionedTransactionSpout(不透明分区事务) IpartitionTractionalSpout(分区事务) IBachBolt

Shellspout/shellbolt(用的比较少,多语言开发时候用到)

BaseComponent 是storm提供比较偷懒的类,它及其子类或多或少实现了其接口定义的部分方法.这样我们在调用的时候,不用自己去实现所有的方法.

Mark( Ispout/IBolt不是Icomponents的子接口而是第一接口)

Storm close的执行(不一定会执行,kill -9时候不会执行 storm kill{topoName}时候会执行 )

 

实现一个Bolt,可以实现IRichBolt接口或者继承BaseRichBolt,如果不想自己处理结果或者反馈,可以实现IBaseBolt接口或者继承BaseBasicBolt,它实际上相当于自动做了prepare方法和collector.emit.ack(inputTuple)

 

Spout里面的Fileds()方法 两个构造方法 一个传入list 一个传入数组

//declarer.declare(new Fields("log"));

定义发射数据格式

 

Values是一个列表实现了iterator接口(用来发送数据)

 

在spout中获取字段是在execute函数中用Tuple参数获得.(只是返回值可能不同)

Tuple.getValue/tuple.getValueByField(“log”);

Tuple.getStringByField("log");

日志模式下有tail特性。

Storm分组方式一共为六种

1.Shuffle Grouping:随机分组(轮询)

2.Fields Grouping:按字段分组

3.All Grouping:广播发送(对于每一个tupleBolts,都会接收的到)

4.Global Grouping:全局分组

5:Non Grouping:不分组(和shuffle Grouping一样效果,不平均分配)

6.Direct Grouping:直接分组(只有被声明为Direct Stream的消息流可以声明这种分组方法)

策略方式开启多线程时候会进行分配

 

对于spout bolt接受方式都是广播方式

 

Storm的方案设计只能是从MQ(kakfka一类消息中间件)中进行读取,不适合从DB文件读取,因为storm在服务器提交后会分发到很多服务器(supervisor上)进行工作,而数据源是DB text的话只能一台机器工作.

 

Spout读单个文件开多并发会出现数据重复,而从MQ就不会.因为每份数据只会被消费一次

 

单线程进行汇总

 

Batch操作

通过实现Icommitter接口或者TransactionTopologyBuilder的setCommitterBolt方法把BatchBolt添加到topology里面

事务Topologies帮我们做了

1管理状态(存在zookeeper中)

2协调事务(管理决定任何一个时间点应该processing还是committering)

3错误检测(ack的跟踪)

事务里面两个ID (TransactionAttempt)

1 attemtId重发会变,storm用来确实重发的版本

2 txid重发不会变,一个事务一个ID

元数据(metadata管理storm数据从哪里开始发)

 

Spout

(一个为接口一个为方法.通常使用接口,因为可以多重实现)

普通事务:

ItransactionSpout<T> BaseTransactionalSpout

分区事务:

SpoutIparititonedTransactionalSpout<T>

BasePartitionedTransactionalSpout<T>

不透明分区事务:

IOpaquePartitionedTransactionalSpout<T>,

BaseOpaquePartitionedTransactionalSpout<T>

Bolt

IBatchBolt<T>:同BaseBatchBolt<T>普通批处理

BaseTransactionalBolt:事务Bolt

接口Icommitter:标识IbatchBolt或者BaseTransactionBolt是否是一个committer CoordinatedBolt