一、CEP是什么

在应用系统中,总会发生这样或那样的事件,有些事件是用户触发的,有些事件是系统触发的,有些可能是第三方触发的,但它们都可以被看做系统中可观察的状态改变,例如用户登陆应用失败、用户下了一笔订单或RFID传感器回报的消息。应对状态改变的策略可以分为两类,一类是简单事件处理(Simple event processing),一般简单事件处理会有两个步骤,过滤和路由,决定是否要处理,由谁处理,另一类是复杂事件处理(Complex event processing),复杂事件处理本身也会处理单一的事件,但其典型特质是需要对多个事件组成的是事件流进行检测分析并响应。

在维基百科中也对CEP做了定义,“CEP是一种事件处理模式,它从若干源中获取事件,并侦测复杂环境的事件或模式,CEP的目的是确认一些有意义的事件(比如某种威胁或某种机会),并尽快对其作出响应”,可见CEP的主要特点包括:复杂性,需要在多源的事件流中进行检测;低延迟,秒级或毫秒级的响应,比如应对威胁;高吞吐,需要迅速对大量或者超大量事件流作出响应。

以往的CEP框架往往处理大量收集到的事件,不能处理正在收集的事件,这时,Flink来了。

二、Flink CEP

Flink作为目前大数据领域实时计算的主流计算框架,天然支持低延迟、高吞吐等特性,再加上Flink中的窗口模型和状态模型,更是对CEP提供了非常强大的支撑。Flink中专门实现了复杂事件处理的库——Flink CEP,用来方便的进行在事件流中检测事件模式。

以下是一个简单的例子,说明在Flink中如何实现CEP:

 public class CepEvent {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env
= StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Tuple3<Integer, String, String>> eventStream = env.fromElements(
Tuple3.of(1500, "login", "fail"),
Tuple3.of(1500, "login", "fail"),
Tuple3.of(1500, "login", "fail"),
Tuple3.of(1320, "login", "success"),
Tuple3.of(1450, "exit", "success"),
Tuple3.of(982, "login", "fail"));
AfterMatchSkipStrategy skipStrategy = AfterMatchSkipStrategy.skipPastLastEvent();
Pattern<Tuple3<Integer, String, String>, ?> loginFail =
Pattern.<Tuple3<Integer, String, String>>begin("begin", skipStrategy)
.where(new IterativeCondition<Tuple3<Integer, String, String>>() {
@Override
public boolean filter(Tuple3<Integer, String, String> s,
Context<Tuple3<Integer, String, String>> context) throws Exception {
return s.f2.equalsIgnoreCase("fail");
}
}).times(3).within(Time.seconds(5));
PatternStream<Tuple3<Integer, String, String>> patternStream =
CEP.pattern(eventStream.keyBy(x -> x.f0), loginFail);
DataStream<String> alarmStream =
patternStream.select(new PatternSelectFunction<Tuple3<Integer, String, String>, String>() {
@Override
public String select(Map<String, List<Tuple3<Integer, String, String>>> map) throws Exception {
String msg = String.format("ID %d has login failed 3 times in 5 seconds."
, map.values().iterator().next().get(0).f0);
return msg;
}
}); alarmStream.print(); env.execute("cep event test");
}
}

运行结果如下:

  可见成功了捕获了ID为1500的用户。

在Flink中实现一个CEP可以总结为四步:一,构建需要的数据流,二,构造正确的模式,三,将数据流和模式进行结合,四,在模式流中获取匹配到的数据。其中第一步和第三步一般会是标准操作,核心在于第二部构建模式,需要利用Flink CEP支持的特性,构造出正确反映业务需求的匹配模式。

三、Flink CEP中对CEP的支撑

Flink CEP的核心在于模式匹配,对于不同模式匹配特性的支持,往往决定相应的CEP框架是否能够得到广泛应用。Flink CEP对模式提供了如下的一些支持:

(一)   支持匹配模式

模式匹配具有一些共同的基础模式,对不同的模式匹配的语义的表达和实现,意味着这种模式能在多大范围内得到应用。

Flink CEP对模式匹配的语义支持具有如下特点:

  1. 支持匹配数量,提供匹配次数的支持,可以指定匹配一次或多次(oneOrMore),可以指定匹配固定数量次(times(n)),也可以指定范围固定数量次(times(n,m))。
  2. 支持历史匹配,在匹配的过程中,既可以对当前事件进行属性判断,也可以对匹配事件组中的历史匹配结果进行回溯来进行判定。
  3. 支持组匹配,支持将单模式进行组合成为模式组,支持不同的组合模式和语义,比如,or,until,begin,next,followBy,otNext,notFollowBy。
  4. 支持窗口匹配,支持时间窗口,可以方便的在某个时间窗口内进行模式匹配。

(二)   支持不同临近条件

如果只是单模式匹配,则无需考虑临近条件。在模式组的执行中,即 多个模式组合执行的过程中,临近条件指的是如何将一组事件匹配到特定的模式组中的不同模式。不同的临近条件的使用,会显著的改变最终匹配的结果。

Flink CEP中支持如下三种临近条件:

A. Strict Contiguity,严格临近指的是匹配事件必须具有严格的前后相邻关系,即匹配事件之间没有非匹配事件。

B. Relaxed Contiguity,宽松匹配指的是匹配事件可以有非匹配事件,非匹配事件的存在不阻挡非连续事件被匹配成功。

C. Non-Deterministic Relaxed Contiguity,非确定性宽松匹配在宽松匹配的基础上,即使某个事件被某个模式匹配完毕还可以参加后面其他模式的匹配。

(三)   支持不同匹配后策略

匹配后策略指的是当某一组事件成功匹配了某个模式之后,这组事件以何种方式参与后续的模式匹配。不同的匹配后策略会导致大相径庭的匹配结果,所以在实际开发中,需要小心的选择合适的匹配后策略。

Flink CEP支持如下五种匹配后策略:

A. NO_SKIP策略,意即当前事件组中的事件还会不受约束的参与后续的模式匹配。

B. SKIP_TO_NEXT策略,意即当前事件组中除了第一个事件之外,其他事件可以不受约束的参与后续的模式匹配。

C. SKIP_PAST_LAST_EVENT策略,意即当前事件组中的任意一个事件都不参与后续的模式匹配。

D. SKIP_TO_FIRST策略,此种策略需要指定一个模式,当前事件组中的任何子匹配如果包含指定模式匹配事件组中的最大匹配事件组,则此子匹配会被丢弃。

E.  SKIP_TO_LAST策略,此种策略需要指定一个模式,当前事件组中的任何子匹配如果包含指定模式匹配事件组中的最小匹配事件组,则此子匹配会被丢弃。

(四)   支持事件时间与乱序

在CEP的处理过程中,事件到达的顺序至关重要,因为事件到达的顺序会真正决定是否可以与相应的模式成功匹配。目前业界已有的CEP计算框架一般都采用事件到达的自然顺序,即处理时间作为模式匹配的基础,这种模式不能满足目前分布式环境下CEP的要求。在大数据分布式环境下,事件到达的顺序和事件发生的顺序往往不匹配,存在延迟到达和乱序等情况,这时往往需要依靠事件时间来进行相应的模式匹配,不然就会发生匹配错误或者匹配失效。

Flink特有的事件时间模型,包括event time特性与watermark机制同样可以在Flink CEP中发挥作用。Flink CEP会将事件进行缓存,不在一开始就进行模式匹配,在相应的watermark到底之后,Flink CEP将缓存中的事件按照事件时间进行排序,然后再进行相应的模式匹配,能够在很大程度上解决分布式环境下的CEP难题。

四、结尾

CEP在生活中的各行各业可以有很多应用,比如金融行业的风险控制、欺诈识别、行情策略等等,比如安全领域的攻击告警、危险建模、漏洞发现等等,再比如智能交通、用户漏斗等等,再关联目前的IOT,其可应用的场景不胜枚举。需要进一步挖掘和改进Flink CEP的能力,为各种业务场景赋能和输出价值。

Flink cep的初步使用的更多相关文章

  1. Flink – CEP NFA

    看看Flink cep如何将pattern转换为NFA? 当来了一条event,如果在NFA中执行的? 前面的链路,CEP –> PatternStream –> select –> ...

  2. Flink/CEP/规则引擎/风控

    基于 Apache Flink 和规则引擎的实时风控解决方案 ​ 对一个互联网产品来说,典型的风控场景包括:注册风控.登陆风控.交易风控.活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后三 ...

  3. Apache Flink CEP 实战

    本文根据Apache Flink 实战&进阶篇系列直播课程整理而成,由哈啰出行大数据实时平台资深开发刘博分享.通过一些简单的实际例子,从概念原理,到如何使用,再到功能的扩展,希望能够给打算使用 ...

  4. 大数据计算引擎之Flink Flink CEP复杂事件编程

    原文地址: 大数据计算引擎之Flink Flink CEP复杂事件编程 复杂事件编程(CEP)是一种基于流处理的技术,将系统数据看作不同类型的事件,通过分析事件之间的关系,建立不同的时事件系序列库,并 ...

  5. 8.Flink实时项目之CEP计算访客跳出

    1.访客跳出明细介绍 首先要识别哪些是跳出行为,要把这些跳出的访客最后一个访问的页面识别出来.那么就要抓住几个特征: 该页面是用户近期访问的第一个页面,这个可以通过该页面是否有上一个页面(last_p ...

  6. Flink 灵魂两百问,这谁顶得住?

    Flink 学习 https://github.com/zhisheng17/flink-learning 麻烦路过的各位亲给这个项目点个 star,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧 ...

  7. 第一章-Flink介绍-《Fink原理、实战与性能优化》读书笔记

    Flink介绍-<Fink原理.实战与性能优化>读书笔记 1.1 Apache Flink是什么? 在当代数据量激增的时代,各种业务场景都有大量的业务数据产生,对于这些不断产生的数据应该如 ...

  8. 流计算技术实战 - CEP

    CEP,Complex event processing Wiki定义 "Complex event processing, or CEP, is event processing that ...

  9. FlinkCEP - Complex event processing for Flink

    https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/libs/cep.html 首先目的是匹配pattern sequenc ...

随机推荐

  1. 前端小知识-html5

    一.伪类与伪元素 为什么css要引入伪元素和伪类:是为了格式化文档树以外的信息,也就是说,伪类和伪元素是用来修饰不在文档树中的部分 伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根 ...

  2. SparkSQL Adaptive Execution

    转自 https://mp.weixin.qq.com/s/Oq9L3Cmc-8G9oL8dvZ5OHQ 1 背景 本文介绍的 Adaptive Execution 将可以根据执行过程中的中间数据优化 ...

  3. 使用executor、callable以及一个Future 计算欧拉数e

    package test; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMo ...

  4. 详解python函数的参数

    详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...

  5. springboot搭建通用mapper

    对于搭建一个小项目自己测试玩如果采用传统的SSM框架配置起来太过于繁琐,使用springboot简化配置再搭配通用mapper简直不要太方便,话不多说,直接上代码. 首先是pom文件,直接去sprin ...

  6. Oracle笔记_多表查询

    1 执行sql文件 @文件地址名 --执行某个sql文件: 2 多表查询 想要的数据不在同一张表,就需要多个表进行联查. 多表查询也叫做表连接查询,其中的where条件就是连接条件. 可以使用join ...

  7. Scala 系列(九)—— 继承和特质

    一.继承 1.1 Scala中的继承结构 Scala 中继承关系如下图: Any 是整个继承关系的根节点: AnyRef 包含 Scala Classes 和 Java Classes,等价于 Jav ...

  8. Leetcode之二分法专题-704. 二分查找(Binary Search)

    Leetcode之二分法专题-704. 二分查找(Binary Search) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 t ...

  9. 借助 RAM disk 技术,加快前端工程打包速度

    背景以 Jenkins 服务器为例,在构建内部的这个项目时,CE 每部署一次服务,最快 6 分钟,最慢将近 13 分钟左右.遇到多个项目并发打包会因为资源占用等问题时间会延长,甚至出现过几次 20 分 ...

  10. python中,一个函数想使用另一个函数中的变量

    问题: 第一个函数中用到了变量a:第二个函数也想使用变量a. 解决方法: 在第一个函数中将变量a定义为全局变量,然后在第二个函数中,也写上global a即可. 示例: def func1(): gl ...