流式處理新玩法,Esper和Storm的聯合統計分析

一、首先是一個開源項目(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();
    }
}

然後就可以看到輸出結果啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章