說到Esper,不得不說一下CEP。CEP即Complex Event Process,中文意思就是“複雜事件處理”。聽起來好像很複雜,實際上就是基於事件流進行數據處理,把要分析的數據抽象成事件,然後將數據發送到CEP引擎,引擎就會根據事件的輸入和最初註冊的處理模型,得到事件處理結果。
有人可能要問了,這和Hadoop有什麼區別?可是本人不才,沒學過Hadoop,雖然說趕上了這陣風,但是從很多人那瞭解以後,覺得不過就是個不是特別成熟的工具,然後各個公司要根據需求對Hadoop進行二次開發,就需要懂得源碼的人。所以就沒打算學了,一個工具而已,等到自己確實有空的時候再學也不遲。至於CEP和Hadoop的區別,應該是Esper和Hadoop的區別,我的理解是:Hadoop適合做事後分析,而Esper適合實時分析。Hadoop我確實不是很瞭解,如果有問題還希望大家指正。
CEP是一種標準,Esper只是對這個標準的一種開源實現。除了Esper,很多大公司也有類似的商業軟件,比如IBM,Sybase等等,聽說巨貴無比。CEP的一個重要特點就是他是一個內存計算工具和類SQL語句。內存計算可以說是一把雙刃劍。好處自不必說,一個字:快!壞處也顯而易見,數據有丟失的風險,而且還有容量的限制(實時計算其實並不受制於內存大小,而是得看如何對實時進行定義,也就是具體的業務來決定了)。所以如果業務不能容忍數據丟失,那麼高可用方案就必須做好,不過Esper的高可用很不好做,後面我將會說到。
CEP的類SQL語句,可以理解爲處理模型的定義與描述。這是運行在CEP引擎中的特殊語句,之所以叫他類SQL,是因爲它和SQL確實很像,除了select,insert,delete,update,而且也有avg,count等函數。所以對於會SQL的人來說,他的語法結構大致還是能猜出一二的。在Esper中,這個句子叫做EPL,即Event Process Language。作爲Esper的核心內容,對於它的講解有三四百頁的英文文檔,所以之後我會慢慢向大家細細說明的。
下面就簡單寫個列子給大家看看吧。場景是計算3個蘋果的平均價格
- package test;
- import com.espertech.esper.client.EPAdministrator;
- import com.espertech.esper.client.EPRuntime;
- import com.espertech.esper.client.EPServiceProvider;
- import com.espertech.esper.client.EPServiceProviderManager;
- import com.espertech.esper.client.EPStatement;
- import com.espertech.esper.client.EventBean;
- import com.espertech.esper.client.UpdateListener;
- /**
- *
- * @author luonanqin
- *
- */
- class Apple
- {
- private int id;
- private int price;
- public int getId()
- {
- return id;
- }
- public void setId(int id)
- {
- this.id = id;
- }
- public int getPrice()
- {
- return price;
- }
- public void setPrice(int price)
- {
- this.price = price;
- }
- }
- class AppleListener implements UpdateListener
- {
- public void update(EventBean[] newEvents, EventBean[] oldEvents)
- {
- if (newEvents != null)
- {
- Double avg = (Double) newEvents[0].get("avg(price)");
- System.out.println("Apple's average price is " + avg);
- }
- }
- }
- public class Test {
- public static void main(String[] args) throws InterruptedException {
- EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
- EPAdministrator admin = epService.getEPAdministrator();
- String product = Apple.class.getName();
- String epl = "select avg(price) from " + product + ".win:length_batch(3)";
- EPStatement state = admin.createEPL(epl);
- state.addListener(new AppleListener());
- EPRuntime runtime = epService.getEPRuntime();
- Apple apple1 = new Apple();
- apple1.setId(1);
- apple1.setPrice(5);
- runtime.sendEvent(apple1);
- Apple apple2 = new Apple();
- apple2.setId(2);
- apple2.setPrice(2);
- runtime.sendEvent(apple2);
- Apple apple3 = new Apple();
- apple3.setId(3);
- apple3.setPrice(5);
- runtime.sendEvent(apple3);
- }
- }
Esper的官網:http://esper.codehaus.org/ 裏面有很多例子可以研究一下。
轉載自:http://blog.csdn.net/luonanqin