流式計算在一些情況下會用到分佈式緩存,從而實現(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用於輕鬆、高效實施數據監測、監控類、實時交易類項目。EPL語法見SODSQL寫法與示例。圖形化建模請使用SODBASE Studio。嵌入式方式編程參見運行第一個EPL例子。與Storm集成參見EPL與Storm集成。