1. 程式人生 > >esper之相關概念

esper之相關概念

1.事件流分析 EPL語句從一個或多個事件流中派生和聚合資訊,加入或合併事件流,並將一個時間流的結果提供給後續的語句。EPL在select語句和where語句的使用上,和SQL很類似,不過,EPL語句用事件流和views替換了資料庫的表格。和SQL中表格相似,views定義了可用於查詢和過濾的資料。views可以表示一個事件流上的一個視窗。views也可以排序事件、從事件屬性獲取統計資料、進行事件分組或者處理唯一的事件屬性值。 select avg(price) from StockTickEvent.win:time(30 sec);計算股票事件過去30s的平均價格。 select symbol, avg(price) as averagePrice from StockTickEvent.win:length(100) group by symbol;前100條股票事件的平均值
下面的例子關聯了兩個事件流。第一個事件流由欺詐告警事件組成,用於儲存過去30分鐘的事件資訊。第二個流則是withdrawal事件,用來儲存過去30秒的事件。這兩個流通過account number進行關聯:
select     fraud.accountNumber as accntNum, 
            fraud.warning as warn, 
            withdraw.amount as amount,    
            MAX( fraud.timestamp, withdraw.timestamp) as timestamp,
             'withdrawlFraud'    as desc    from FraudWarningEvent.win:time(30 min) as fraud,
            WithdrawalEvent.win:time(30 sec)  as withdraw where fraud.accountNumber=withdraw.accountNumber</span>
2.事件模式匹配 Event patterns match when an event or multiple events occur that match the pattern's definition.當符合模式定義的一個或多個事件發生時,就認為事件模式匹配了。 模式也可以是基於時間的。模式匹配是通過狀態機實現的。 模式表示式可以由連線了模式操作符的過濾器表示式組成。通過在圓括號中的嵌入表示式,可以實現更深的模式表示式巢狀。 5類操作符:
  • 控制模式探測器的建立和終止:every
  • 邏輯操作符:and、or、not
  • 操作事件順序的時間操作符:->(緊跟著發生的,followed by)
  • 過濾輸出事件的where條件,引起模式探測器的終止:如,timer:within
  • 和觀察其他事件一樣,觀察者也觀察時間事件,如,timer:interval,timer:at
下面是一些EPL的例子:
//模式匹配的是在接下來60秒鐘IBM股票值大於80的所有事件  every StockTickEvent(symbol="IBM", price>80) where timer:within(60 seconds)
//每小時的第5分鐘給出提醒:  every timer:at(5, *, *, *, *)
//當A事件發生時,如果後面跟的是B事件或C事件,則給出提醒(輸出A事件)  A -> ( B or C )
//匹配的是每一個EventX,如果後跟EventY事件,並且其objectID和EventX的objectID一樣,則給出提醒(輸出a事件):  every a=EventX -> every b=EventY(objectID=a.objectID)
3 模式匹配和事件流分析結合使用 當檢測到事件序列(或者沒有事件發生)時,模式就會匹配。模式匹配的結果可以用於進一步的分析和處理。 下面的模式監測的是 Status事件發生後的10s沒有相同IDstatus事件發生的場景。整個EPL語句進一步計算了所有發生的每個ID的事件總數。
select a.id, count(*) from pattern [          every a=Status -> (timer:interval(10 sec) and not Status(id=a.id)  ] group by id
4    命名視窗 命名視窗在引擎中是全域性的資料視窗,其可以參與到很多的語句查詢,並且可以被多個statement執行selectinsertdelete操作。命名視窗和關係型資料庫系統的表很相似。
通過下面的幾步可以建立命名視窗:
create window AlertNamedWindow as (origin string, priority string, alarmNumber long)
當事件到達時,可以觸發一個selectupdatedelete操作。下面是一個select應用,簡單的統計資料視窗中的記錄行總數:
on TriggerEvent select count(*) from AlertNamedWindow
5    匹配-識別模式匹配(Match-Recognize Pattern Matching) 匹配-識別模式是一個基於正則表示式的模式匹配語法,是建議列入SQL的標準語法。 下面的匹配-識別模式,探測的是可能出現在事件中的模式,這些事件通過命名視窗(如上宣告)儲存。這個模式查詢的是兩個緊跟的事件,即事件之間沒有相同的origin。第一個事件必須有一個“high”優先順序,第二個事件必須是“medium”優先順序。
select * from AlertNamedWindow    
    match_recognize (     
         partition by origin      
            measures a1.origin as origin, a1.alarmNumber as alarmNumber1, a2.alarmNumber as alarmNumber2      
            pattern (a1 a2)     
             define        a1 as a1.priority = 'high',        
                            a2 as a2.priority = 'medium'   )
6    變數(Variables) 變數是一個標量、物件或者事件值,可用於所有的statement,包括模式。變數可以用在EPL中任意位置的表示式中。 總結 開發Esper應用時,事件型別建議採用Java類,對於事件資訊的描述更為直觀。在具有複雜關係的事件設計中,不建議使用Map的方式。

在EPL設計時,根據業務需求,如果能通過標準的SQL語法完成的,儘量不要使用匹配模式,因為在執行時,需要對Pattern進行額外的解析,其規則較SQL複雜,效能上有少許損耗。

資料視窗的使用,能夠使得Esper處理更為複雜的應用場景,比如與分散式快取、靜態資料的使用等。變數不難理解,不管是高階的開發語言如java、C/C++,還是指令碼語言如ruby、JS等,都有變數的概念,其使用範圍,僅限於當前的Esper引擎例項。

後續文章會詳細介紹本文所提的概念。