IBolt:
bolt接口类,定义了常用的几个接口,IBolt的实现类在client上被创建,然后序列化到拓扑里并被提交到集群的master上,之后nimbus会启动worker进行反序列化,调用prepare进行准备完毕之后就开始处理tuples
如果是在java里定义bolts ,建议实现IRichBolt.java接口类,IRichBolt.java同时继承了IComponent.java接口,提供了更多对拓扑进行操作的方法。
/** * 当集群中的worker初始化一个跟当前Bolt相关的task时候被调用,此方法提供和准备bolt执行时的环境. * @param stormConf 此bolt使用的storm配置,合并了本机和集群的配置,将会提供给topology * @param context task的上下文,可以获取taskId,componentId,input,output等 * @param collector 用于任意时刻提交bolt里的tuples,collector是线程安全的,应当保存在Bolt里. */ void prepare(Map stormConf, TopologyContext context, OutputCollector collector); /** * 处理单个输入的tuple * 这里面使用OutputCollector来提交tuples. * 官方建议所有的输入tuples在处理完之后进行ack或者fail,否则storm无法判断该tuples是否被处理完毕 * 一般使用IBasicBolt,在execute方法中额外提供了outputCollector,会更加方便处理 * @param input */ void execute(Tuple input); /** * Bolt关闭的时候被调用,由于是被supervisor使用kill 9干掉的,所以并不保证cleanup会被执行 */ void cleanup();
AI 代码解读
IComponent.java
组件接口,所有的bolt和spout都可以视作组件 /** * 申明了当前组件的输出模式 * @param declarer 申明输出streamId,输出的field,判断一个output stream是否是direct stream */ void declareOutputFields(OutputFieldsDeclarer declarer); /** *获取组件配置. * @return */ Map<String, Object> getComponentConfiguration();
AI 代码解读
IRichBolt.java
跟IBolt接口相似,只是多继承了IComponent,多了申明输出和获取配置两个接口 IBasicBolt.java /** * 跟IBolt.java中作用类似,只是少了OutPutCollector */ void prepare(Map stormConf, TopologyContext context); /** * 跟Ibolt.java中作用类似,多了OutPutCollector */ void execute(Tuple input, BasicOutputCollector collector); void cleanup();
AI 代码解读