Flink-复杂事件(CEP)
什么是复杂事件CEP?
一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想得到的数据,满足规则的复杂事件。
特征:
- 目标:从有序的简单事件流中发现一些高阶特征
- 输入:一个或多个由简单事件构成的事件流
- 处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件
- 输出:满足规则的复杂事件
CEP架构
CEP-NFA
CEP-NFA是什么?
Flink 的每个模式包含多个状态,模式匹配的过程就是状态转换的过程,每个状态(state)可以理解成由Pattern构成,为了从当前的状态转换成下一个状态,用户可以在Pattern上指定条件,用于状态的过滤和转换。
实际上Flink CEP 首先需要用户创建定义一个个pattern,然后通过链表将由前后逻辑关系的pattern串在一起,构成模式匹配的逻辑表达。然后需要用户利用NFACompiler,将模式进行分拆,创建出NFA(非确定有限自动机)对象,NFA包含了该次模式匹配的各个状态和状态间转换的表达式。整个示意图就像如下:
CEP-三种状态迁移边
- Take: 表示事件匹配成功,将当前状态更新到新状态,并前进到“下一个”状态;
- Procceed: 当事件来到的时候,当前状态不发生变化,在状态转换图中事件直接“前进”到下一个目标状态;
- IGNORE: 当事件来到的时候,如果匹配不成功,忽略当前事件,当前状态不发生任何变化。
为了更好的理解上述概念,我们利用下面代码,构建一个nfa:
//构建链接
patterns Pattern pattern = Pattern.begin("start").where(new SimpleCondition() {
private static final long serialVersionUID = 5726188262756267490L;
@Override public boolean filter(Event value) throws Exception {
return value.getName().equals("c");
}
}).followedBy("middle").where(new SimpleCondition() {
private static final long serialVersionUID = 5726188262756267490L;
@Override public boolean filter(Event value) throws Exception {
return value.getName().equals("a");
}
}).optional();
//创建nfa NFA nfa = NFACompiler.compile(pattern, Event.create*erializer(), false);
相关文章