本文参考尚学堂flink课件,
侵权删
复杂事件处理(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通 过分析事件之间的关系,建立不同的事件关系序列库,并利用过滤、关联、聚合等技术,最 终由简单事件产生高级事件,并通过模式规则的方式对重要信息进行跟踪和分析,从实时数据中发掘有价值的信息
一. CEP相关概念
1. 配置依赖
在使用 FlinkCEP 组件之前,需要将 FlinkCEP 的依赖库引入项目工程中。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-cep-scala_2.11</artifactId>
<version>1.9.1</version>
</dependency>
2. 事件定义
- 简单事件:
处理单一事件, 事件的定义可以 直接观察出来, 处理过程中无须关注多个事件之间的关系. - 复杂事件:
复杂事件处理的不仅是单一的事件, 也处理由多个事件组 成的复合事件. 复杂事件处理监测分析事件流(Event Streaming), 当特定事件发生时来触发某些动作.
复杂事件中事件与事件之间包含多种类型关系, 常见的有时序关系、聚合关系、层次关系、依赖关系及因果关系等.
二. Pattern API
FlinkCEP 中提供了 Pattern API 用于对输入流数据的复杂事件规则定义, 并从事件流 中抽取事件结果. 包含四个步骤:
- 输入事件流的创建
- Pattern 的定义
- Pattern 应用在事件流上检测
- 选取结果
1. 模式定义
1. 说明
-
定义 Pattern 可以是单次执行模式, 也可以是循环执行模式. 单次执行模式一次只接受 一个事件, 循环执行模式可以接收一个或者多个事件. 通常情况下, 可以通过指定循环次数将单次执行模式变为循环执行模式. 每种模式能够将多个条件组合应用到同一事件之上, 条件组合可以通过 where 方法进行叠加. 每个 Pattern 都是通过 begin 方法定义的
val start = Pattern.begin[Event]("start_pattern")
-
下一步通过 Pattern.where()方法在 Pattern 上指定 Condition, 只有当 Condition 满 足之后, 当前的 Pattern 才会接受事件。
start.where(_.getCallType == "success")
2. 设置循环次数
对于已经创建好的 Pattern,可以指定循环次数,形成循环执行的 Pattern。
-
times: 可以通过 times 指定固定的循环执行次数.
//指定循环触发4次 start.times(4); //可以执行触发次数范围,让循环执行次数在该范围之内[2-4次] start.times(2, 4);
-
optional: 也可以通过 optional 关键字指定要么不触发要么触发指定的次数.
// 要么不触发, 要么触发4次 start.times(4).optional(); // 要么不触发, 要么触发2-4次 start.times(2, 4).optional();
-
greedy: 可以通过 greedy 将 Pattern 标记为贪婪模式, 在 Pattern 匹配成功的前提下, 会尽可能多地触发.
//触发2、3、4次,尽可能重复执行 start.times