1.Storm单机模式
Storm提供了单机开发模式,即使没有Storm集群也可以在本地java环境中进行开发测试。
2.入门案例
a.需求
利用Storm实现实时的单词统计
b.分析需求
c.创建java项目,导入Storm相关开发包
d.开发SentenceSpout
想要开发一个Spout需要写一个类实现 IComponent接口 和 ISpout接口,实现相应方法。
直接实现这两个接口需要实现的方法比较多,可以选择继承BaseRichSpout默认实现类,此类已经实现过如上两个接口,并将大部分方法做了默认空实现,只需继承者开发最重要的三个方法即可。而其它方法只需在需要时覆盖父类的默认空实现即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package cn.tedu.storm;
import java.util.Map;
import backtype.storm.spout.SpoutOutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseRichSpout; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values;
public class SentenceSpout extends BaseRichSpout{
private String [] senteces = { "my name is park", "i am so shuai", "do you like me", "are you sure you do not like me", "ok i am sure" };
private SpoutOutputCollector collector = null;
/** * 初始化的方法,当当前spout被初始化时调用 * * conf:配置对象,包含配置信息,配置信息合并自集群配置和当前拓扑的配置 * context:上下文对象,代表当前spout运行的环境,可以通过该对象获取 任务 组件 拓扑相关的信息 * collector:用来发送tuple的对象,可以任意位置发送tuple,这个方法线程安全,通常保存在类的内部方便使用 */ @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { this.collector = collector; }
/** * storm会不停的调用此方法,来要求spout发送一个tuple。 * 如果有tuple则通过collector发送,如果没有也不要阻塞这个方法,直接返回即可。 * storm的底层在用一个死循环不停的调用 nextTuple ack fail方法 * 如果真的没有tuple要发送,在返回之前最好睡上一毫秒,以便于不至于浪费过多cpu。 */ |