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引擎实例。

后续文章会详细介绍本文所提的概念。









你可能感兴趣的:(esper之相关概念)