一、首先是一個開源項目(storm-ester):
https://github.com/tomdz/storm-esper
二、導入工程項目
自帶的TwitterEsperSample.java例子好像不太好用,反正運行着沒什麼效果
自己寫一個例子
總的來說就是spout模擬發送5次數據,EsperBolt接收後根據規則進行統計輸出(這裏是每兩次計算平均值),然後最後一個bolt展示結果
1、首先是一個Spout:
public class Esper_Spout extends BaseRichSpout {
SpoutOutputCollector collector;
Map<Integer, String> toSend;
@Override
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
this.collector = spoutOutputCollector;
System.out.println(">Spout-->>open<<");
toSend = new HashMap<Integer, String>();
for (int i = 5; i < 10; i++) {
toSend.put(i, "test--" + i);
}
}
@Override
public void nextTuple() {
if (!toSend.isEmpty()) {
for (Map.Entry<Integer, String> transactionEntry : toSend.entrySet()) {
Integer transactionId = transactionEntry.getKey();
System.out.println(">Spout->send:" + transactionId);
//發送需要esper計算的數據,可多個
collector.emit(tuple(transactionId));
}
toSend.clear();
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("price"));
}
}
2、然後寫一個Bolt接收Esper處理後的結果輸出
public class Esper_Bolt implements IRichBolt {
private OutputCollector collector;
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
this.collector = outputCollector;
}
@Override
public void execute(Tuple tuple) {
//這裏就是結果啦
Object result = tuple.getValueByField("tps");
System.out.println("-->>bolt esper result--->"+result);
}
@Override
public void cleanup() {
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("word"));
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
3、最後來個main 方法運行起來
public class Esper_Sample {
public static void main(String[] args) {
Logger.getRootLogger().removeAllAppenders();
EsperBolt bolt = new EsperBolt.Builder()
.inputs().aliasStream("spout1").toEventType("Apple")
.outputs().onDefaultStream().emit("tps")
.statements().add("select avg(price) as tps from Apple.win:length_batch(2)")
.build();
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout1", new Esper_Spout());
builder.setBolt("get-categ", bolt) .shuffleGrouping("spout1");
builder.setBolt("get-result", new Esper_Bolt()) .shuffleGrouping("get-categ");
Config conf = new Config();
conf.setDebug(true);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test", conf, builder.createTopology());
// Utils.sleep(3000);
// cluster.shutdown();
}
}
然後就可以看到輸出結果啦