一,学习CEP的目的,说白了是因为业务需要,需要更深入的理解,并使用到更复杂的场景,先说一下 CEP是什么:
复杂事件处理(CEP)是一种基于流处理的技术,将系统数据看做不同类型的事件,通过分析事件之间的关系,建立不同的事件关系序列库,并利用 过滤,关联,聚合等技术,最终由简单事件产生高级事件,并通过模式规则的方式对重要信息进行跟踪和分析,从数据中发掘有价值的信息。
目前主要用于网络欺诈,故障检测,风险规避,智能营销等领域。
1,环境准备,导入依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-cep-scala_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
2,基本概念~耐着性子哟
1)事件定义
简单事件:简单事件存在于现实场景,主要处理单一事件,比如对订单统计,超过一定数量就报告。
复杂事件:复杂事件处理的不仅是单一的事件,也处理由多个事件组成的复合事件。
2)事件关系
时序关系:动作事件与动作事件之间,动作事件和状态变化事件之间,都存在时间顺序,事件与事件的时序关系决定了大部分的时序规则,例如A事件状态持续为1的同时B事件状态变为0。
聚合关系:动作事件与动作事件之间,状态变化事件和状态变化事件之间都存在聚合关系,个体聚合为整体。例如A事件状态为1的次数为10 触发警报。
层次关系:动作事件与动作事件之间,状态变化事件和状态变化事件之间都存在层次关系,父子关系,从父类到子类是具体化的,从子类到父类是泛化的。
依赖关系:A事件触发前提是B事件触发。
因果关系:A事件改变触发导致了B事件触发 。
3)事件处理
相应的规则执行相应的处理策略,这些策略包括了推断,查因,决策,预测等方面的应用。
事件推断:从一部分状态属性值推断出另一部分的状态属性值,比如已经 1+x=2 x=1。
事件查因:当出现结果状态,并且知道初始状态,可以查明是哪个动作导致的。
事件决策:知道结果状态,并且知道初始状态,可以知道要执行什么动作。
事件预测:知道初始状态,可以知道执行动作,可以知道结果状态。
3,Pattren API
FlinkCEP提供了Pattren API 用于对输入流数据的复杂事件规则定义,并从事件流中抽取事件结果。案例如下,抽取温度大于35度的信号事件结果:
import org.apache.flink.cep.scala.CEP
import org.apache.flink.cep.scala.pattern.Pattern
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.scala._
object FlinkCEP_demp {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val data: DataStream[Event] = env.fromElements(
Event("A",22.2,"test1"),
Event("B",22.2, "test2"),
Event("C",11.1, "test3"),
Event("D",33.3