【Flink】Flink cep

一、概念

什么是 CEP:

  • 复合事件处理(Complex Event Processing,CEP)
  • Flink cep 是在 flink 中实现的一个复杂事件处理库
  • 一个或多个简单事件构成的事件流通过一定的规则匹配,然后输出用户得到的数据–满足规则的复杂事件

CEP 的特征如下:

  • 目标:从有序的简单事件流中发现一些高阶特征

  • 输入:一个或多个简单事件构成的事件流

  • 处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件;

  • 输出:满足规则的复杂事件

市场上有多种 CEP 的解决方案,例如Spark、Samza、Beam等,但他们都没有提供专门的库支持。然而,Flink提供了专门的CEP库。

Flink CEP 包含如下组件:Event Stream、Pattern定义、Pattern检测和生成Alert。

  • 首先,开发人员要在 DataStream 流上定义出模式条件
  • 之后 Flink CEP 引擎进行模式检测,必要时生成警告

简单来说一下,其实可以把使用 flink CEP 当做平时用的正则表达式,cep中的 Pattern 就是定义的正则表达式,flink 中的DataStream 就是正则表达式中待匹配的字符串,flink 通过DataStream 和 自定义的Pattern进行匹配,生成一个经过过滤之后的DataStream。

基于自定义的pattern,可以做很多工作,比如监控报警、风控、反爬等等。

二、核心–Pattern API

处理事件的规则,被叫作模式(Pattern)。Flink CEP提供了Pattern API用于对输入流数据进行复杂事件规则定义,用来提取符合规则的事件序列。

模式大致分为两类:

个体模式(Individual Patterns):组成复杂规则的每一个单独的模式定义,就是个体模式。

start.times(3).where(_.behavior.startsWith("fav"))

组合模式(Combining Patterns,也叫模式序列):很多个体模式组合起来,就形成了整个的模式序列。

val pattern = Pattern.begin[Event]("start").where(_.getId == 42)
  .next("middle").subtype(classOf[SubEvent]).where(_.getVolume >= 10.0)
  .followedBy("end").where(_.getName == "end")

2.1、个体模式

个体模式包括单例模式和循环模式。单例模式只接收一个事件,而循环模式可以接收多个事件。

2.1.1、量词

可以在一个个体模式后追加量词,也就是指定循环次数。

// 匹配出现4次
start.time(4)
// 匹配出现0次或4次
start.time(4).optional
// 匹配出现2、3或4次
start.time(2,4)
// 匹配出现2、3或4次,并且尽可能多地重复匹配
start.time(2,4).greedy
// 匹配出现1次或多次
start.oneOrMore
// 匹配出现0、2或多次,并且尽可能多地重复匹配
start.timesOrMore(2).optional.greedy
2.1.2、条件

每个模式都需要指定触发条件,作为模式是否接受事件进入的判断依据。

CEP中的个体模式主要通过调用.where()、.or()和.until()来指定条件。按不同的调用方式,可以分成以下几类:

**简单条件:**通过.where()方法对事件中的字段进行判断筛选,决定是否接收该事件

start.where(event=>event.getName.startsWith("foo"))   

**组合条件:**将简单的条件进行合并,or()方法表示或逻辑相连,where的直接组合就相当于与and。

Pattern.where(event => …/*some condition*/).or(event => /*or condition*/)

**终止条件:**如果使用了oneOrMore或者oneOrMore.optional,建议使用.until()作为终止条件,以便清理状态。

**迭代条件:**能够对模式之前所有接收的事件进行处理,调用.where((value,ctx) => {…}),可以调用ctx.getEventForPattern(“name”)

2.2、组合模式

了解了独立模式,现在看看如何将它们组合成一个完整的模式序列。

模式序列必须以初始模式开始,如下所示:

val start : Pattern[Event, _] = Pattern.begin("start")

接下来,可以通过指定它们之间所需的连续条件,为模式序列添加更多模式。 Flink CEP 支持事件之间以下形式的邻接:

  • 严格连续性(Strict Contiguity):预期所有匹配事件一个接一个地出现,中间没有任何不匹配的事件。
  • 宽松连续性(Relaxed Contiguity):忽略匹配的事件之间出现的不匹配事件。
  • 非确定性宽松连续性(Non-Deterministic Relaxed Contiguity):进一步放宽邻接,允许忽略一些匹配事件的其他匹配。

要在连续模式之间应用它们,可以使用:

  • next():用于严格连续
  • followBy():用于宽松连续性
  • followAyAny():用于非确定性宽松连续性

除了以上模式序列外,还可以定义“不希望出现某种近邻关系”:

  • notNext():不想让某个事件严格紧邻前一个事件发生
  • n
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值