文章目录
一、概念
什么是 CEP:
- 复合事件处理(Complex Event Processing,CEP)
- Flink cep 是在 flink 中实现的一个复杂事件处理库
- 一个或多个简单事件构成的事件流通过一定的规则匹配,然后输出用户得到的数据–满足规则的复杂事件
CEP 的特征如下:
-
目标:从有序的简单事件流中发现一些高阶特征
-
输入:一个或多个简单事件构成的事件流
-
处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件;
-
输出:满足规则的复杂事件
市场上有多种 CEP 的解决方案,例如Spark、Samza、Beam等,但他们都没有提供专门的库支持。然而,Flink提供了专门的CEP库。
Flink CEP 包含如下组件:Event Stream、Pattern定义、Pattern检测和生成Alert。
- 首先,开发人员要在 DataStream 流上定义出模式条件
- 之后 Flink CEP 引擎进行模式检测,必要时生成警告
简单来说一下,其实可以把使用 flink CEP 当做平时用的正则表达式,cep中的 Pattern 就是定义的正则表达式,flink 中的DataStream 就是正则表达式中待匹配的字符串,flink 通过DataStream 和 自定义的Pattern进行匹配,生成一个经过过滤之后的DataStream。
基于自定义的pattern,可以做很多工作,比如监控报警、风控、反爬等等。
二、核心–Pattern API
处理事件的规则,被叫作模式(Pattern)。Flink CEP提供了Pattern API用于对输入流数据进行复杂事件规则定义,用来提取符合规则的事件序列。
模式大致分为两类:
个体模式(Individual Patterns):组成复杂规则的每一个单独的模式定义,就是个体模式。
start.times(3).where(_.behavior.startsWith("fav"))
组合模式(Combining Patterns,也叫模式序列):很多个体模式组合起来,就形成了整个的模式序列。
val pattern = Pattern.begin[Event]("start").where(_.getId == 42)
.next("middle").subtype(classOf[SubEvent]).where(_.getVolume >= 10.0)
.followedBy("end").where(_.getName == "end")
2.1、个体模式
个体模式包括单例模式和循环模式。单例模式只接收一个事件,而循环模式可以接收多个事件。
2.1.1、量词
可以在一个个体模式后追加量词,也就是指定循环次数。
// 匹配出现4次
start.time(4)
// 匹配出现0次或4次
start.time(4).optional
// 匹配出现2、3或4次
start.time(2,4)
// 匹配出现2、3或4次,并且尽可能多地重复匹配
start.time(2,4).greedy
// 匹配出现1次或多次
start.oneOrMore
// 匹配出现0、2或多次,并且尽可能多地重复匹配
start.timesOrMore(2).optional.greedy
2.1.2、条件
每个模式都需要指定触发条件,作为模式是否接受事件进入的判断依据。
CEP中的个体模式主要通过调用.where()、.or()和.until()来指定条件。按不同的调用方式,可以分成以下几类:
**简单条件:**通过.where()方法对事件中的字段进行判断筛选,决定是否接收该事件
start.where(event=>event.getName.startsWith("foo"))
**组合条件:**将简单的条件进行合并,or()方法表示或逻辑相连,where的直接组合就相当于与and。
Pattern.where(event => …/*some condition*/).or(event => /*or condition*/)
**终止条件:**如果使用了oneOrMore或者oneOrMore.optional,建议使用.until()作为终止条件,以便清理状态。
**迭代条件:**能够对模式之前所有接收的事件进行处理,调用.where((value,ctx) => {…}),可以调用ctx.getEventForPattern(“name”)
2.2、组合模式
了解了独立模式,现在看看如何将它们组合成一个完整的模式序列。
模式序列必须以初始模式开始,如下所示:
val start : Pattern[Event, _] = Pattern.begin("start")
接下来,可以通过指定它们之间所需的连续条件,为模式序列添加更多模式。 Flink CEP 支持事件之间以下形式的邻接:
- 严格连续性(Strict Contiguity):预期所有匹配事件一个接一个地出现,中间没有任何不匹配的事件。
- 宽松连续性(Relaxed Contiguity):忽略匹配的事件之间出现的不匹配事件。
- 非确定性宽松连续性(Non-Deterministic Relaxed Contiguity):进一步放宽邻接,允许忽略一些匹配事件的其他匹配。
要在连续模式之间应用它们,可以使用:
- next():用于严格连续
- followBy():用于宽松连续性
- followAyAny():用于非确定性宽松连续性
除了以上模式序列外,还可以定义“不希望出现某种近邻关系”:
- notNext():不想让某个事件严格紧邻前一个事件发生
- n