非事务相关接口 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
浙公网安备 33010602011771号