Esper學習之一:Esper介紹

由於項目需要,我開始了學習Esper的任務。剛開始覺得他是個很高級的東西,學了一段時間後發現他確實是很高級的東西。不過貌似在國內的應用很少,網上都查不到什麼資料的,所以我覺得在博客裏寫一下自己的學習的收穫,一是總結所學知識點,二是分享給更多的學習者,畢竟好東西不能這樣被埋沒了。今天就先來簡單介紹一下Esper是什麼玩意兒。

       說到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個蘋果的平均價格

[java] view plaincopy
  1. package test;  
  2.   
  3. import com.espertech.esper.client.EPAdministrator;  
  4. import com.espertech.esper.client.EPRuntime;  
  5. import com.espertech.esper.client.EPServiceProvider;  
  6. import com.espertech.esper.client.EPServiceProviderManager;  
  7. import com.espertech.esper.client.EPStatement;  
  8. import com.espertech.esper.client.EventBean;  
  9. import com.espertech.esper.client.UpdateListener;  
  10.   
  11. /** 
  12.  *  
  13.  * @author luonanqin 
  14.  * 
  15.  */  
  16. class Apple  
  17. {  
  18.     private int id;  
  19.     private int price;  
  20.   
  21.     public int getId()  
  22.     {  
  23.         return id;  
  24.     }  
  25.   
  26.     public void setId(int id)  
  27.     {  
  28.         this.id = id;  
  29.     }  
  30.   
  31.     public int getPrice()  
  32.     {  
  33.         return price;  
  34.     }  
  35.   
  36.     public void setPrice(int price)  
  37.     {  
  38.         this.price = price;  
  39.     }  
  40. }  
  41.   
  42. class AppleListener implements UpdateListener  
  43. {  
  44.   
  45.     public void update(EventBean[] newEvents, EventBean[] oldEvents)  
  46.     {  
  47.         if (newEvents != null)  
  48.         {  
  49.             Double avg = (Double) newEvents[0].get("avg(price)");  
  50.             System.out.println("Apple's average price is " + avg);  
  51.         }  
  52.     }  
  53.   
  54. }  
  55. public class Test {  
  56.   
  57.     public static void main(String[] args) throws InterruptedException {  
  58.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();  
  59.   
  60.         EPAdministrator admin = epService.getEPAdministrator();  
  61.   
  62.         String product = Apple.class.getName();  
  63.         String epl = "select avg(price) from " + product + ".win:length_batch(3)";  
  64.   
  65.         EPStatement state = admin.createEPL(epl);  
  66.         state.addListener(new AppleListener());  
  67.   
  68.         EPRuntime runtime = epService.getEPRuntime();  
  69.   
  70.         Apple apple1 = new Apple();  
  71.         apple1.setId(1);  
  72.         apple1.setPrice(5);  
  73.         runtime.sendEvent(apple1);  
  74.   
  75.         Apple apple2 = new Apple();  
  76.         apple2.setId(2);  
  77.         apple2.setPrice(2);  
  78.         runtime.sendEvent(apple2);  
  79.   
  80.         Apple apple3 = new Apple();  
  81.         apple3.setId(3);  
  82.         apple3.setPrice(5);  
  83.         runtime.sendEvent(apple3);  
  84.     }  
  85. }  
很簡單的例子,雖然沒有加註釋,也應該很好懂吧。大家可以自己運行一下看看是什麼結果。

Esper的官網:http://esper.codehaus.org/ 裏面有很多例子可以研究一下。


轉載自:http://blog.csdn.net/luonanqin

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