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学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
3月前
|
分布式计算 监控 大数据
大数据-131 - Flink CEP 案例:检测交易活跃用户、超时未交付
大数据-131 - Flink CEP 案例:检测交易活跃用户、超时未交付
103 0
|
26天前
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
本文由杭州银行大数据工程师唐占峰、欧阳武林撰写,介绍Flink动态CEP的定义、应用场景、技术实现及使用方式。Flink动态CEP是基于Flink的复杂事件处理库,支持在不重启服务的情况下动态更新规则,适应快速变化的业务需求。文章详细阐述了其在反洗钱、反欺诈和实时营销等金融领域的应用,并展示了某金融机构的实际应用案例。通过动态CEP,用户可以实时调整规则,提高系统的灵活性和响应速度,降低维护成本。文中还提供了具体的代码示例和技术细节,帮助读者理解和使用Flink动态CEP。
398 2
探索Flink动态CEP:杭州银行的实战案例
|
3月前
|
SQL 消息中间件 分布式计算
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
大数据-130 - Flink CEP 详解 - CEP开发流程 与 案例实践:恶意登录检测实现
106 0
|
3月前
|
分布式计算 监控 大数据
大数据-129 - Flink CEP 详解 Complex Event Processing - 复杂事件处理
大数据-129 - Flink CEP 详解 Complex Event Processing - 复杂事件处理
87 0
|
5月前
|
监控 Java API
【揭秘】如何用Flink CEP揪出那些偷偷摸摸连续登录失败的“捣蛋鬼”?——一场数据流中的侦探游戏
【8月更文挑战第26天】Flink 是一款先进的流处理框架,提供复杂事件处理(CEP)功能以识别实时数据流中的特定模式。CEP 在 Flink 中通过 `CEP` API 实现,支持基于模式匹配的事件检测。本文通过监测用户连续三次登录失败的具体案例介绍 Flink CEP 的工作原理与应用方法。首先创建 Flink 环境并定义数据源,接着利用 CEP 定义连续三次失败登录的模式,最后处理匹配结果并输出警报。Flink CEP 能够轻松扩展至更复杂的场景,如异常行为检测和交易欺诈检测等,有效应对多样化的业务需求。
66 0
|
6月前
|
SQL 分布式计算 测试技术
概述Flink API中的4个层次
【7月更文挑战第14天】Flink的API分为4个层次:核心底层API(如ProcessFunction)、DataStream/DataSet API、Table API和SQL。
|
7月前
|
SQL 关系型数据库 API
实时计算 Flink版产品使用问题之如何使用stream api
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
Kubernetes Oracle 关系型数据库
实时计算 Flink版操作报错合集之用dinky在k8s上提交作业,会报错:Caused by: org.apache.flink.table.api.ValidationException:,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
309 0
|
7月前
|
SQL 存储 API
Flink(十五)【Flink SQL Connector、savepoint、CateLog、Table API】(5)
Flink(十五)【Flink SQL Connector、savepoint、CateLog、Table API】
|
4月前
|
运维 数据处理 数据安全/隐私保护
阿里云实时计算Flink版测评报告
该测评报告详细介绍了阿里云实时计算Flink版在用户行为分析与标签画像中的应用实践,展示了其毫秒级的数据处理能力和高效的开发流程。报告还全面评测了该服务在稳定性、性能、开发运维及安全性方面的卓越表现,并对比自建Flink集群的优势。最后,报告评估了其成本效益,强调了其灵活扩展性和高投资回报率,适合各类实时数据处理需求。