Flink之CEP-API简介

简介: 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+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
分布式计算 监控 大数据
大数据-131 - Flink CEP 案例:检测交易活跃用户、超时未交付
大数据-131 - Flink CEP 案例:检测交易活跃用户、超时未交付
394 0
|
SQL 人工智能 关系型数据库
Flink CDC YAML:面向数据集成的 API 设计
本文整理自阿里云智能集团 Flink PMC Member & Committer 徐榜江(雪尽)在 FFA 2024 分论坛的分享,涵盖四大主题:Flink CDC、YAML API、Transform + AI 和 Community。文章详细介绍了 Flink CDC 的发展历程及其优势,特别是 YAML API 的设计与实现,以及如何通过 Transform 和 AI 模型集成提升数据处理能力。最后,分享了社区动态和未来规划,欢迎更多开发者加入开源社区,共同推动 Flink CDC 的发展。
1014 12
Flink CDC YAML:面向数据集成的 API 设计
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
探索Flink动态CEP:杭州银行的实战案例
822 5
|
SQL 人工智能 关系型数据库
Flink CDC YAML:面向数据集成的 API 设计
Flink CDC YAML:面向数据集成的 API 设计
824 5
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
本文由杭州银行大数据工程师唐占峰、欧阳武林撰写,介绍Flink动态CEP的定义、应用场景、技术实现及使用方式。Flink动态CEP是基于Flink的复杂事件处理库,支持在不重启服务的情况下动态更新规则,适应快速变化的业务需求。文章详细阐述了其在反洗钱、反欺诈和实时营销等金融领域的应用,并展示了某金融机构的实际应用案例。通过动态CEP,用户可以实时调整规则,提高系统的灵活性和响应速度,降低维护成本。文中还提供了具体的代码示例和技术细节,帮助读者理解和使用Flink动态CEP。
2058 3
探索Flink动态CEP:杭州银行的实战案例
|
SQL 消息中间件 分布式计算
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
516 0
|
分布式计算 监控 大数据
大数据-129 - Flink CEP 详解 Complex Event Processing - 复杂事件处理
大数据-129 - Flink CEP 详解 Complex Event Processing - 复杂事件处理
537 0
|
SQL 分布式计算 测试技术
概述Flink API中的4个层次
【7月更文挑战第14天】Flink的API分为4个层次:核心底层API(如ProcessFunction)、DataStream/DataSet API、Table API和SQL。
|
监控 Java API
【揭秘】如何用Flink CEP揪出那些偷偷摸摸连续登录失败的“捣蛋鬼”?——一场数据流中的侦探游戏
【8月更文挑战第26天】Flink 是一款先进的流处理框架,提供复杂事件处理(CEP)功能以识别实时数据流中的特定模式。CEP 在 Flink 中通过 `CEP` API 实现,支持基于模式匹配的事件检测。本文通过监测用户连续三次登录失败的具体案例介绍 Flink CEP 的工作原理与应用方法。首先创建 Flink 环境并定义数据源,接着利用 CEP 定义连续三次失败登录的模式,最后处理匹配结果并输出警报。Flink CEP 能够轻松扩展至更复杂的场景,如异常行为检测和交易欺诈检测等,有效应对多样化的业务需求。
384 0
|
Java API 数据中心
Flink之CEP案例分析-网络攻击检测
上一篇我们介绍了Flink CEP的API,这一篇我们将以结合一个案例来练习使用CEP的API编写应用程序,以强化对API的理解。所选取的案例是对网络遭受的潜在攻击进行检测并给出告警。当下互联网安全形势仍然严峻,网络攻击屡见不鲜且花样众多,这里我们以DDOS(分布式拒绝服务攻击)产生的流入流量来作为遭受攻击的判断依据。
3510 0

热门文章

最新文章