storm每个组件都是component组件的子类
其中用的最多的是iRichSpout iBasicBolt iRichBolt BaseComponent
BaseComponent是storm提供的”偷懒“的类,它及其子类都或多或少实现了其接口定义的部分方法。这样我们用的时候,而不是自己每次都写所有方法
spout的最顶层抽象是iSpout接口
====
open()是初始化方法
nextTuple()循环发射数据
ack()成功处理tuple回调方法
fail()处理失败tuple回调方法
active和deactive:spout可以被暂时激活和关闭
close方法在该spout关闭前执行,但是并不能得到保证其一定被执行,kill -9时不执行,Storm kill {topoName}时执行
====
所以关闭的时候一般不会用kill -9
但是我们在关闭nimbus和supervisor的时候我们一般都是用kill -9的方式,因为只有这种方式
ibolt是bolt最高级的封装,定义了三个方法
prepare方法进行初始化,传入当前执行的上下文
execute接受一个tuple进行处理,也可emit数据到下一级组件
cleanup 同ispout的close方法,不保证一定执行,我们正常退出的时候执行
ibolt继承了Serializable,我们在nimbus上提交了topology以后,创建出来的bolt会序列化后发送到具体执行的worker(工作进程)上去。worker在执行该bolt时,会先调用prepare方法传入当前执行的上下文。
execute接受一个tuple进行处理,并用prepare方法传入的outputcollector的ack方法(表示成功)或fail(表示失败)来反馈处理结果
还可以通过outputcollector的emit方法吧结果发射到下一级组件
IBasicBolt接口,实现该接口的Bolt不用在代码中提供反馈结果,storm内部会自动反馈成功,如果你确定要反馈失败,可以抛出FailedException
当然trident均不用显性调用ack和fall,框架会自动调
实现一个bolt,可以实现irichbolt接口或继承bashrichBolt,如果不想自己处理结果反馈,可以实现ibasicbolt接口或继承basebasicbolt,它实际上相当于自动做了prepare方法和collect.emit.ack(inputTuple)
一个简单的使用见:https://github.com/zengxiaosen/stormlearning01.git