Flink之CEP-API简介

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: CEP API的核心是Pattern API,它允许你快速定义复杂的事件模式。每个模式包含多个阶段(stage)或者我们也可称为状态(state)。为了从一个状态切换到另一个状态,用户可以指定条件,这些条件可以作用在邻近的事件或独立事件上。

CEP API的核心是Pattern API,它允许你快速定义复杂的事件模式。每个模式包含多个阶段(stage)或者我们也可称为状态(state)。为了从一个状态切换到另一个状态,用户可以指定条件,这些条件可以作用在邻近的事件或独立事件上。

Pattern在外部无法通过构造器进行实例化,构造器的访问限定符是protected的,因此Pattern对象只能通过begin和next以及followedBy(用于创建其派生类FollowedByPattern)来创建,在创建时需要指定其名称。

每个模式必须以一个初始状态开始且必须指定唯一的名称来标识被匹配的事件:

Pattern<Event, ?> start = Pattern.<Event>begin("start");

通过where方法可以为起始状态指定一个过滤条件:

start.where(new FilterFunction<Event>() {
    @Override
    public boolean filter(Event value) {
        return ... // some condition
    }
});

当然,也可以严格地限制接收事件为初始化的事件类型(Event)的子类型(SubEvent),通过subtype方法:

start.subtype(SubEvent.class).where(new FilterFunction<SubEvent>() {
    @Override
    public boolean filter(SubEvent value) {
        return ... // some condition
    }
});

正如你所看到的,子类型条件也可以与在子类型上的一个额外的过滤条件合并。事实上,你可以通过多次调用where以及subtype方法并指定多个条件,这些条件将会通过逻辑“与”运算符合并。在构建匹配条件时,CEP提供了两个函数类:AndFilterFunction以及SubtypeFilterFunction。其中SubtypeFilterFunction专用于subtype API来判定事件的类型是否符合要求。AndFilterFunction则是通用的逻辑“与”运算符来连接左右表达式。其类图如下:

AndFilterFunction-class-diagram

图中展示了它的构造器,它可以注入两个FilterFunction函数的实例,分别作为逻辑与的左表达式和右表达式。由于AndFilterFunction扩展了接口FilterFunction,而当调用where或subtype API时其实都是在不断扩充左表达式:

Pattern-conditions

接下来,我们可以追加更多的状态来构建更复杂的模式,多个状态的转换涉及到模式对事件的选择策略:

Pattern当前支持严格邻近非严格邻近这两种事件选择策略。事件选择策略在Pattern的API上通过如下两个方法来指定:

  • next:会追加一个新的Pattern对象到既有的Pattern之后,它表示当前模式运算符所匹配的事件必须是严格紧邻的,这意味着两个被匹配的事件必须是前后紧邻,中间没有其他元素;
  • followedBy:会追加一个新的Pattern到既有的Pattern之后(其实返回的是一个FollowedByPattern对象,它是Pattern的派生类),它表示当前运算符所匹配的事件不必严格紧邻,这意味着其他事件被允许穿插在匹配的两个事件之间;

事实上Flink的CEP实现简化了论文里提及的四种事件选择策略。

创建一个新的严格邻近的Pattern:

Pattern<Event, ?> strictNext = start.next("middle");

创建一个非严格邻近的Pattern:

Pattern<Event, ?> nonStrictNext = start.followedBy("middle");

一个复杂的CEP程序可能其模式也较为复杂,而多个Pattern之间通过前向指针建立连接关系从而形成“模式链”,形如下图:

pattern-chain

也可以通过within API为模式定义一个时间约束(也即时间窗口),它表示第一个元素和最后一个元素之间的时间间隔不能超过窗口时间。例如,通过within定义一个模式匹配必须发生在10秒之内。

next.within(Time.seconds(10));

为了在你的事件流上运行模式检测,你得创建一个PatternStream。给定一个输入流input以及一个模式pattern(很有可能是一个模式链的头),你可以通过如下的示例代码创建一个PatternStream:

DataStream<Event> input = ...
Pattern<Event, ?> pattern = ...

PatternStream<Event> patternStream = CEP.pattern(input, pattern);

一旦你获得PatternStream你可以从匹配的事件序列中通过select API或者flatSelect API选择匹配的事件。select API要求一个PatternSelectFunction函数的实现。PatternSelectFunction有一个select方法,会被每个匹配的事件序列调用。它接收一个匹配事件的”状态名/事件”对映射,并恰好返回一个结果:

class MyPatternSelectFunction<IN, OUT> implements PatternSelectFunction<IN, OUT> {
    @Override
    public OUT select(Map<String, IN> pattern) {
        IN startEvent = pattern.get("start");
        IN endEvent = pattern.get("end");

        return new OUT(startEvent, endEvent);
    }
}

PatternFlatSelectFunction跟PatternSelectFunction类似,唯一的区别就是它可以返回任意数量的结果。为了做到这一点,select方法带了一个额外的Collector参数用来输出元素:

class MyPatternFlatSelectFunction<IN, OUT> implements PatternFlatSelectFunction<IN, OUT> {
    @Override
    public void select(Map<String, IN> pattern, Collector<OUT> collector) {
        IN startEvent = pattern.get("start");
        IN endEvent = pattern.get("end");

        for (int i = 0; i < startEvent.getValue(); i++ ) {
            collector.collect(new OUT(startEvent, endEvent));
        }
    }
}

下一小篇我们将以一个示例来展示这些API的应用。


原文发布时间为:2017-02-28

本文作者:vinoYang

本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
1月前
|
SQL 分布式计算 测试技术
Flink API的4个层次
【2月更文挑战第28天】
|
1月前
|
消息中间件 SQL Kafka
如何高效接入 Flink: Connecter / Catalog API 核心设计与社区进展
本文整理自阿里云实时计算团队 Apache Flink Committer 和 PMC Member 任庆盛在 FFA 2023 核心技术专场(二)中的分享。
287 0
如何高效接入 Flink: Connecter / Catalog API 核心设计与社区进展
|
1月前
|
分布式计算 API 数据处理
Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
【2月更文挑战第15天】Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
60 1
|
1月前
|
定位技术 流计算
在Flink CEP中,可以通过定义带有时间约束的模式来匹配事件的持续时间
【2月更文挑战第12天】在Flink CEP中,可以通过定义带有时间约束的模式来匹配事件的持续时间
35 3
|
2月前
|
SQL 消息中间件 Apache
flink问题之cep超时事件如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
39 1
|
3月前
|
JSON 关系型数据库 MySQL
这个问题是由于Flink的Table API在处理MySQL数据时,将MULTISET类型的字段转换为了JSON格式
【1月更文挑战第17天】【1月更文挑战第84篇】这个问题是由于Flink的Table API在处理MySQL数据时,将MULTISET类型的字段转换为了JSON格式
34 1
|
4月前
|
存储 API 数据安全/隐私保护
2021年最新最全Flink系列教程__Flink高级API(四)
2021年最新最全Flink系列教程__Flink高级API(四)
36 0
|
4月前
|
消息中间件 API 数据安全/隐私保护
2021年最新最全Flink系列教程__Flink高级API(三)
2021年最新最全Flink系列教程__Flink高级API(三)
18 0
|
4月前
|
消息中间件 Kafka API
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二.五)
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二.五)
40 0
|
4月前
|
消息中间件 关系型数据库 MySQL
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二)
2021年最新最全Flink系列教程_Flink原理初探和流批一体API(二)
126 0