Storm架构中各角色之间的关系
Component组件
绿色是最常用的,红色是与事务相关的
Spout
Spout的最顶层抽象是ISpout接口
Open()是初始化方法
nextTuple()循环发射数据
ack() 成功处理tuple回调方法
Fail()处理失败tuple回调方法
activate和deactivate :spout可以被暂时激活和关闭
close方法在该spout关闭前执行,
但是并不能得到保证其一定被执行,kill -9时不执行,
Storm kill {topoName} 时执行。
通常情况下实现一个Spout,可以直接实现接口IRichSpout,如果不想写多余的代码,可以直接继承BaseRichSpout。
Bolt
IBolt定义了三个方法:
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。
实现一个Bolt,可以实现IRichBolt接口或继承BaseRichBolt,如果不想自己处理结果反馈,可以实现 IBasicBolt接口或继承BaseBasicBolt,它实际上相当于自动做了prepare方法和 collector.emit.ack(inputTuple)。