storm使用(二)–使用java操作storm
一、简介
这里介绍使用java对storm的操作示例,包括拓扑定义、提交等。
二、storm特点
2.1 元组可靠性保证
storm能保证每一个元组都被完全处理,如果任务处理失败,会从消息源重新处理。每个元组完全处理后,会调用源spout的ack方法,否则调用源spout的fail方法,基于此能保证元组的可靠性。
2.2 容错性
storm被设置为无状态和快速失败。如果worker死亡,storm会重启,如果一个节点失败,storm会在其他节点重启。也就是直接kill进程不会影响topology。
2.3 可与任何语言使用
storm核心是基于thrift接口,因此topology可以用任何语言定义和提交。
三、storm基础接口
3.1 org.apache.storm.topology.IComponent接口
IComponent是所有组件的接口。方法有:
//指定元组的输出模式,声明输出流id、输出字段等。
void declareOutputFields(OutputFieldsDeclarer declarer);
//声明指定组件的配置
Map<String, Object> getComponentConfiguration();
3.2 org.apache.storm.spout.ISpout接口
ISpout是spout的核心接口,方法有:
//初始化spout时调用,其中conf为该spout的storm配置,context提供spout上下文信息,collector为收集器,用于发送元组。
void open(Map<String, Object> conf, TopologyContext context, SpoutOutputCollector collector);
//消息的源头,storm定期调用该方法获取元组。
void nextTuple();
//元组被完全处理时调用。
void ack(Object msgId);
//元组未被完全处理时(配置的超时时间内)调用,storm将重新处理该元组。
void fail(Object msgId);
//spout关闭时调用。
void close();
//spout从失效模式中激活时调用,后续nextTuple方法将会调用。
void activate();
//spout失效时调用,后续nextTuple方法不会被调用。
void deactivate();
3.3 org.apache.storm.task.IBolt接口
IBolt是bolt的核心接口,方法有:
//组件初始化时调用,topoConf为该bolt的storm配置,context为该bolt上下文信息,collector为收集器,用于发送元组。
void prepare(Map<String, Object> topoConf, TopologyContext context, OutputCollector collector);
//处理输入元组。
void execute(Tuple input);
//bolt关闭时调用。(非正常情况不会调用)
void cleanup();
3.4 org.apache.storm.topology.IRichSpout接口
IRichSpout接口继承ISpout和IComponent,定义如下:
public interface IRichSpout extends ISpout, IComponent {
}
3.5 org.apache.storm.topology.IRichBolt接口
IRichBolt接口继承自IBolt和IComponent,定义如下:
public interface IRichBolt extends IBolt, IComponent {
}
四、storm基础类
4.1 org.apache.storm.topology.base.BaseComponent类
//IComponent接口的基本抽象实现
public abstract class BaseComponent implements IComponent{
}
4.2 org.apache.storm.topology.base.BaseRichSpout类
BaseRichSpout类是开发中Spout使用的基础类,定义如下:
public abstract class BaseRichSpout extends BaseComponent implements IRichSpout{
}
4.3 org.apache.storm.topology.base.BaseBasicBolt类
BaseRichBolt类是开发中Bolt使用的基础类,自动对处理元组确认(区别于直接实现IRichBolt接口,需要手动确认collector.ack(tuple)),定义如下:
//元组自动确认
public abstract class BaseBasicBolt extends BaseComponent implements IBasicBolt{
}
五、拓扑
5.1 拓扑创建类
org.apache.storm.topology.TopologyBuilder是拓扑创建类。
5.1.1 TopologyBuilder创建及常用方法
TopologyBuilder是拓扑创建类,示例生成如下:
TopologyBuilder builder = new TopologyBuilder();
常用方法有:
//在拓扑中声明一个spout(该方法有其他重载方法),id为该组件id,spout定义的spout,parallelism_hint为分配的任务数(每个任务一个线程)
public SpoutDeclarer setSpout(String id, IRichSpout spout, Number parallelism_hint){
}
//在拓扑中声明一个bolt(该方法有其他重载方法),id为该组件id,将会被想消费的组件引用;bolt为定义的bolt;parallelism_hint为分配的任务数(每个任务一个线程)。
public BoltDeclarer setBolt