flink CEP表示复杂事件处理。
CEP开发流程:
- 输入事件流的创建即DataStream
- pattern的定义即规则定义
- 通过pattern规则去事件流匹配
- 选取结果
pattern
1.规则定义
1.首先每个规则的定义都是通过Patttern.begin进行定义的。( ----val start = Pattern.begin[Event]("start_pattern") ----- )
2.规则条件
条件
定义条件 在 FlinkCEP 中通过 pattern.where()、 pattern.or()及pattern.until()方法来为 Pattern 指定条件
简单条件
start.where(_.getID == "9527") 根据事件中的字段信息进行判断
组合条件 默认每个条件通过 AND 逻辑相连比如.where(..).where(...) 构成and条件。 .where(..).or(..)构成或的条件。
val start = Pattern.begin[Event]("start_pattern") .where(_.callType=="success").or(_.age >30)
终止条件 如果程序中使用了 oneOrMore 或者 oneOrMore().optional()方法,还可以指定停止条件
start.oneOrMore.until(_.getID == "123")
循环次数
对于已经创建好的 Pattern,可以指定循环次数,形成循环执行的 Pattern
times
//指定循环触发4次 start.times(4); //可以执行触发次数范围,让循环执行次数在该范围之内 start.times(2, 4);
optional
start.times(4).optional() 要么不触发,要么触发指定的次数 start.times(2, 4).optional() 要么不触发,要么触发指定的次数
greedy
//触发2、3、4次,尽可能重复执行 start.times(2, 4).greedy() //触发0、2、3、4次,尽可能重复执行 start.times(2, 4).optional().greedy()
oneOrMore
// 触发一次或者多次 start.oneOrMore() //触发一次或者多次,尽可能重复执行 start.oneOrMore().greedy() // 触发0次或者多次 start.oneOrMore().optional() // 触发0次或者多次,尽可能重复执行 start.oneOrMore().optional().greedy()
timesOrMore
// 触发两次或者多次 start.timesOrMore(2); // 触发两次或者多次,尽可能重复执行 start.timesOrMore(2).greedy() // 不触发或者触发两次以上,尽可能重复执行 start.timesOrMore(2).optional().greedy()
模式序列
其中有严格邻近、宽松邻近、非确定宽松邻近三种邻近连接条件。
=严格邻近= =next
//示例 begin("first").where(_.name='a').next("second").where(_.name='b') //当且仅当数据为a,b时,模式才会被命中。如果数据为a,c,b,由于a的后面跟了c,所以a会被直接丢弃,模式不会命中。
=宽松邻近= followedBy
//示例 begin("first").where(_.name='a').followedBy("second").where(_.name='b') //当且仅当数据为a,b或者为a,c,b,模式均被命中,中间的c会被忽略掉。
=非确定宽松邻近= followedByAny
//示例 begin("first").where(_.name='a').followedByAny("second").where(.name='b') //当且仅当数据为a,c,b,b时,对于followedBy模式而言命中的为{a,b}, //对于followedByAny而言会有两次命中{a,b},{a,b}
pattern检测
//Pattern检测
val patternStream = CEP.pattern[Event](dataStream,pattern)