1.ISpout
ISpout是一个核心接口,用于将数据以Tuple方式发送至topology去执行,每个Tuple都会通过一个spout发射出去,storm将会跟踪整个DAG,当storm发现每个Tuple都被成功处理了,那么他就会发送一个ack数据给Spout.
如果Tuple执行失败,他就会在topology配置一个timeout,storm会把错误信息发送给Spout
当一个spout发送一个Tuple时,他就会给Tuple赋上一个标签(message id),这个标签可以是任意类型,当storm发送一个ack(成功)或者fails(失败)消息时,他就会将message id回传过来以鉴别Tuple是哪一个.
Storm会在同一个线程下调用executes ack, fail, 和nextTuple方法,这意味着实现者
ISpout不需要担心这些方法之间的并发问题
核心方法:
-
open
初始化时调用
参数:(Map conf, TopologyContext context, SpoutOutputCollector collector)
Map conf: 放spout配置(configuration)
TopologyContext context: 上下文
SpoutOutputCollector collector: 用于发送 -
close
当Ispout关闭时调用
不会保证一定会被调用 -
activate
-
deactivate
-
nextTuple
storm通过collector发送数据时会被调用 -
ack
tuple处理成功,strom会反馈给spout一个成功消息 -
fail
tuple处理失败,strom会反馈给spout一个失败消息
实现类:
-
BaseRichSpout(最常用)
继承了BaseComponent,实现了IRichSpout -
DRBCSpout
-
ShellSpout
2.IComponent
这是一个常用方法,在所有topology有关的组件,这个借口会在在java api中使用
他实现了一个Serializable(java.io)接口
核心方法:
-
declareOutputFields
声明输出字段,用于声明当前spout/bolt发送的tuple名称 -
getComponentConfiguration
获取组件配置
3.IBolt
一个IBolt代表一个组件,组件用于接收tuple数据并进行处理,他不会立刻处理数据,而是要先拿出tuple数据然后进行处理
生命周期:
在客户端计算机上创建的IBolt对象。IBolt被序列化到topology中(使用Java序列化)并提交到集群的主计算机(Nimbus).然后Nimbus启动反序列化对象的workers,调用prepare,然后开始处理元组。
核心方法:
-
prepare
预备方法,类似于ISPout中的open,参数于open一致,他会提供IBolt的运行时环境 -
execute
他会处理每一个tuple,tuple包括了元数据(来源,value),这个tuple应该能使用OutputCollector发射出去
,这个东西已经在prepare中准备好了 -
cleanup
清理操作
实现类:
- BaseRichBolt
继承了BaseComponent,实现了IRichBolt,BaseComponent继承了IComponent