Flink-复杂事件(CEP)

2020-07-01 00:00:00 定义 状态 事件 输出 匹配

什么是复杂事件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);

相关文章