总结:构成部分:
Spout部分:继承BaseRichSpout类,实现里边的三个方法:nextTuple,open,declareOutPutFields.主要的方法在nexttuple中写,打包成集合的形式,在这个方法中用emit发送,同时在declareOutPutFields也有发送
Bolt方法:继承BaseRichBolt类,实现内部的三个方法:execute,open,declareOutputDeclare。主要是在execute中写,包括切分集合等。如果还有一个步骤的话,那还需要再发送给下一步。
Main方法:创建:TopologyBuilder tb=new TopologyBuilder();
用tb分别去调动其他的线程和进程,里边设置Grouping的方法和形式
LocalCluster lc=new LocalCluster();
调用。
1.Test测试代码
package com.bjsxt.storm.test;
import com.bjsxt.storm.bolt.WsBolt;
import com.bjsxt.storm.spout.WsSpout;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.topology.TopologyBuilder;
/**
*
* 构建拓扑结构 Topology ----- 》job
*
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
TopologyBuilder tb = new TopologyBuilder();
tb.setSpout("wsspout", new WsSpout());
tb.setBolt("wsbolt", new WsBolt()).shuffleGrouping("wsspout");
//创建本地服务集群
LocalCluster lc = new LocalCluster();
lc.submitTopology("ws", new Config(), tb.createTopology());
}
}
2.Spout:发送端
package com.bjsxt.storm.spout;
import java.util.List;
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;
/**
*
* 数据累加: 1+2+3+4......
*
* @author Administrator
*
*/
public class WsSpout extends BaseRichSpout {
Map map;
TopologyContext context;
SpoutOutputCollector collector;// 发送器
int i = 0;
/**
* 发送数据,不断被线程调用
*/
@Override
public void nextTuple() {
i++;
List tuple = new Values(i);
this.collector.emit(tuple);
System.err.println("spout -----------------------" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void open(Map map, TopologyContext context, SpoutOutputCollector collector) {
this.map = map;
this.context = context;
this.collector = collector;
}
/**
* 声明发送数据的信息
*/
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("num"));
}
}
3.Bolt:计算与分析
package com.bjsxt.storm.bolt;
import java.util.Map;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;
public class WsBolt extends BaseRichBolt {
Map stormConf;
TopologyContext context;
OutputCollector collector;
int sum = 0;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.stormConf = stormConf;
this.context = context;
this.collector = collector;
}
@Override
public void execute(Tuple input) {
// 1.接收tuple内的数据
int i = input.getIntegerByField("num");
// 2.累加
sum += i;
//3.输出效果
System.out.println("sum-------------------------------"+sum);
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
}