复杂事件处理(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通过分析事件之间的关系,建立不同的事件关系序列库,并利用过滤,关联,聚合等技术最终由简单事件产生高级事件,并通过模式匹配规则的方式对重要信息进行跟踪和分析。从实时数据中发掘有价值的信息。复杂事件处理主要应用于防范网络欺诈、设备故障检测、风险规避和智能营销等领域。
Flink基于DataStream API提供了FlinkCEP组件栈,专门用于复杂事件处理。
1、简单事件
处理单一事件,事件的定义可以直接观察出来。处理过程中无须关注多个事件之间的关系,能够通过简单的数据处理手段将结果计算出来。
2、复杂事件
复杂事件处理不仅是单一事件,也处理由多个事件组成的复合事件。复杂事件处理检测分析事件流,当特定事件发生时来触发某些动作。
复杂事件中事件与事件之间包含多种类型关系,常见的有时序关系、聚合关系、层次关系、依赖关系和因果关系等。
Flink CEP中提供了Pattern API用于对输入流数据的复杂事件规则定义,并从事件流中抽取事件结果。
1、输入事件流的创建
2、Pattern的定义
2.1模式分类:
(1)单次执行模式
一次只接受一个事件
(2)循环执行模式
接受一个或者多个事件
2.2设置循环次数
对于已经创建好的Pattern,可以指定循环次数,形成循环执行的Pattern
(1)times:指定固定的循环执行次数
(2)optional:通过Optional关键字指定要么不触发要么触发指定的次数
(3)greedy:贪婪模式,在pattern匹配成功的前提下会尽可能多的触发
(4)oneOrMore:指定触发一次或多次
(5)timesOrMore:指定触发固定次数以上
2.3定义条件
(1)简单条件
Simple Condition继承于Iterative Condition类,根据事件中的字段信息进行判断,决定是否接受事件
(2)组合条件
将简单条件合并,且关系使用And连接,或关系使用or连接
(3)终止条件
使用了oneOrMore或者oneOrMore().optional(),则必须指定终止条件,否则模式中的规则会一直循环下去。until()指定终止
2.4 模式序列
将相互独立的模式进行组合然后形成模式序列。各个模式之间通过邻近条件进行连接
(1)严格近邻(next)
所有事件都按照顺序满足模式条件,不允许忽略任意不满足的模式
例:“ a next b”,事件序列【a,c,b1,b2】没有匹配
(2)宽松邻近(followedBy)
会忽略没有成功匹配的模式条件,没有严格邻近要求高,可以理解成or的逻辑
例:“a followedBy b” 事件序列:【a,c,b1,b2】匹配{a,b1}
(3)非确定宽松邻近(followedByAny)
可以忽略已经匹配的条件
例:"a followedByAny b" 事件序列:【a,c,b1,b2】匹配{a,b1},{a,b2}
(4)不希望出现某种邻近关系
notNext:不想让某一个事件严格近邻前一个事件发生
notFollowedBy:不想让某个事件在两个事件之间发生
(5)指定时间约束(within)
指定模式在多长时间内匹配有效
注意:
(1)通过指定循环次数将单次执行模式变成循环执行模式。
(2)每种模式能够将多个条件组合到同一事件上,条件组合使用where叠加,
(3)每个pattern通过begin定义
(4)Pattern.where()方法在pattern上指定Condition,只有当Condition满足之后,当前Pattern才会接受事件。
(5)模式序列不能以notFollowedBy结束
(6)Not类型的模式不能被optional修饰
3、Pattern应用在事件流上检测
patternStream=CEP.pattern(数据流,模式)
4、选取结果
FlinkCEP提供select和flatSelect两种方法从PatternStream提取事件结果