SODBASE CEP學習(四)續:類SQL語言EPL與Storm或jStorm集成-使用分佈式緩存

流式計算在一些情況下會用到分佈式緩存,從而實現(1)想把統計或計算結果保存在分佈緩存中,供其它模塊或其它系統調用。(2)某一滑動時間窗口上計數,例如實時統計1小時每個Cookie的訪問量,實時統計某商品1天內的銷售數量和銷售額,實時統計某商家1天內的銷售量。由於SODBASE CEP引擎本身集成了Redis分佈式緩存接口,同時在Storm上可以方便地使用SODBASE EPL語句。因此,通過Storm with SQL也就可以方便地使用Redis、在Redis上做滑動窗口了。

1.示例操作步驟

功能:實時統計1小時每個Cookie的訪問量

1.1製作模型文件

本小節對用到的模型文件建模和單元測試,讀者如果時間有限,也可以直接進入下一小節

(1)網上下載一個Redis, 建議使用Redis 3.0以上linux版本,SODBASE CEP已支持與Redis 3.0以上的Redis Cluster集成。如果覺得麻煩想快速把例子跑起來,可以用這個Windows版,解壓,默認端口6379啓動。

(2)下載SODBASE Studio 2.0.22(sp2)版本以上

下載示例CEP模型cookie00.sod、cookie01.sod、cookie02.sod、cookie03.sod

(3)運行SODBASE Studio,導入cookie00.sod、cookie01.sod、cookie02.sod、cookie03.sod

讀者可以查看各個模型的EPL語句,和輸入輸出配置。

cookie00:模擬Cookie實時生成數據,連接到cookie01的輸入

cookie01:有兩個輸出適配器(輸出適配器一個重要功能是動作執行),一個添加新數據,一個過期化舊數據,從而在緩存保持10秒滑動窗口。

cookie02:一個輸出適配器,查詢計數值

cookie03:屏幕輸出

(4)將4個EPL模型全部測試運行起來

(5)輸出結果

(6)爲了在Storm中使用EPL模型,將cookie03的輸出配置爲storm輸出。將cookie01、cookie02、cookie03轉化爲XML模型文件。cookie00不需要,下面步驟在Storm中寫了一個Spout作數據來源。

1.2 編寫topology代碼

下載最新版示例Storm-EPL-Example,解壓後導入到Eclipse中。不用maven,依賴的包都在lib文件夾下,加到build path即可。

開啓redis服務器,打開com.sodbase.integration.storm.cookie.CookieSlidingWindowCountTopology.java

Run As->Java Application,就可以在Eclipse中看到輸出效果


打包後的jar包可以部署到storm服務器上。

注:使用jStorm的讀者,配置方法和Storm一致。在Eclipse工程的lib/storm中使用jstorm依賴的jar包即可。

2. 工作原理

CookieSlidingWindowCountTopology代碼如下

package com.sodbase.integration.storm.cookie;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
import backtype.storm.utils.Utils;

import com.sodbase.integration.storm.PrintBolt;
import com.sodbase.outputadaptor.storm.EPLBolt;

public class CookieSlidingWindowCountTopology {

  public static void main(String[] args) throws Exception {
    TopologyBuilder builder = new TopologyBuilder();
   
    
	/**
	 * EPLBolt相關配置
	 */
    //(1)Bolt的tuple連到EPL哪個流輸入上面    
    String streamname="cookie01.input";
    //(2)輸出的字段,與EPL輸出對應
    Fields outputFields = new Fields("CountIn10Sec","cookieid");
    //(3)EPL引擎cep home
    String cep_home="cep_home";
    //(4)EPL模型文件
    String[] cepmodelfiles=new String[]{
    		//update sliding window with redis
    		"cep_home/files/cookieexample/cookie01.xml",
    		//count
    		"cep_home/files/cookieexample/cookie02.xml",
    		//emit
    		"cep_home/files/cookieexample/cookie03.xml",
    		};

    builder.setSpout("event", new RandomCookieSpout(), 1);
    builder.setBolt("EPL", new EPLBolt(streamname,outputFields,cep_home,cepmodelfiles), 1).shuffleGrouping("event");
    builder.setBolt("print1", new PrintBolt(), 1).shuffleGrouping("EPL");

    Config conf = new Config();
    conf.setDebug(false);

    if (args != null && args.length > 0) {
      conf.setNumWorkers(3);

      StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
    }
    else {

      LocalCluster cluster = new LocalCluster();
      cluster.submitTopology("test", conf, builder.createTopology());
      Utils.sleep(1000000);
      cluster.killTopology("test");
      cluster.shutdown();
    }
  }
}

參考:

SODBASE CEP學習(四):類SQL語言EPL與Storm或jStorm集成

SODBASE CEP學習(四)續:類SQL語言EPL與Storm或jStorm集成-滑動窗口

SODBASE CEP學習進階篇(七):SODBASE CEP與Spark streaming集成

SODBASE CEP學習進階篇(五):與分佈式緩存集成

SODBASE CEP用於輕鬆、高效實施數據監測、監控類、實時交易類項目微笑EPL語法見SODSQL寫法與示例。圖形化建模請使用SODBASE Studio嵌入式方式編程參見運行第一個EPL例子。與Storm集成參見EPL與Storm集成


開發者社區活動,SODBASE產品的用戶現在可以領禮品 

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