Apache Flink中的广播状态实用指南

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 自版本1.5.0以来,ApacheFlink提供了一种新的状态类型,称为广播状态(Broadcast State)。在本文中,我们会解释什么是广播状态,并通过一个例子,演示如何将其应用于一个用来评估基于事件流的动态模式的应用程序。

自版本1.5.0以来,ApacheFlink提供了一种新的状态类型,称为广播状态(Broadcast State)。在本文中,我们会解释什么是广播状态,并通过一个例子,演示如何将其应用于一个用来评估基于事件流的动态模式的应用程序。本文将指导大家学习广播状态的处理步骤和相关的源代码,以便在今后的实践中能实现此类的应用。

什么是广播状态?

广播状态可以用于通过一个特定的方式来组合并共同处理两个事件流。第一个流的事件被广播到另一个operator的所有并发实例,这些事件将被保存为状态。另一个流的事件不会被广播,而是发送给同一个operator的各个实例,并与广播流的事件一起处理。广播状态非常适合两个流中一个吞吐大,一个吞吐小,或者需要动态修改处理逻辑的情况。我们将使用后者的一个具体实例来解释广播状态,并在本文的其余部分里对详细的API加以说明。

使用广播状态的动态模型评估(Dynamic Pattern Evaluation with Broadcast State)

假设一个电子商务类型的网站,它获取了所有用户的操作行为数据作为一个用户的操作流。网站的运营团队致力于分析用户的操作,来提高销售额,改善用户体验,并监测和预防恶意行为。我们要实现了一个流应用程序,用于检测用户事件流中的模式。但是,公司希望避免在每次模式有变化的时候还要修改和重新部署应用程序。反而,我们使用另外一个特征流来读取、更新当前特征,接下来我们通过一个实例逐步阐述如何通过ApacheFlink中的广播状态来完成相应工作。

image.png

实例的程序获取两个数据流。第一个流提供了网站上的用户操作行为数据,如上图左上方所示。一个用户的交互事件由操作的类型(用户登录、用户注销、添加到购物车或者完成付款等)和用户的ID(按颜色编码的)组成。图中的用户操作事件流包含用户1001的“登出”操作,然后是用户1003的“支付完成”事件,以及用户1002的“添加到购物车”操作。

第二个流提供了应用程序要评估的用户操作模式。模式是由两个连续的操作组成的。在上图中,模式流包含了以下两种:

• 模式1:用户登录并立即登出,并没有点击网站上其它的页面;
• 模式2:用户将商品添加到购物车,然后登出,而并没有完成购买操作;

这样的模式有助于企业更好地分析用户行为、检测恶意行为和提高网站体验。例如,如果只是将商品添加到购物车里而没有完成后续的支付,那么网站可以采取合适的方法,更好地了解用户没有购买的原因,并采取一定的措施以提高网站的购买转化率(例如提供优惠券、免运费等)。

在上图右侧,显示了一个operator的三个并发实例,这些实例获取模式和用户操作行为的数据流,评估数据流上的模式,并向下游发出模式匹配事件。为了简便起见,我们的例子中的operator只对一个进行两次后续操作行为的模式进行评估。当从模式流中获取到新模式的时候,将替换当前活动的模式。原则上,该operator也可以实现评估更复杂的模式或多个模式,这些模式可以单独添加或是删除。

我们将描述负责模式匹配的程序如何处理用户的操作和模式流。

image.png

首先,向operator发送一个模式,该模式被广播给这个operator的三个并发实例,接着,每个并发实例将模式存储在广播状态中。由于广播状态只能使用广播数据来进行更新,因此所有并发实例的状态都应该是相同的。

image.png

接下来,第一个用户信息流会基于用户 ID进行划分,并发送给operator的实例。分区会确保同一用户的所有操作都由同一并发实例处理。上图显示了在operator实例处理了第一个模式和前三个操作行为事件之后应用程序的状态。

当任务接收到新的用户操作数据时,它通过查看用户最新的和历史的操作记录来评估当前的活动模式。对于每个用户,operator都在keyed state中存储用户的上一个操作。到目前为止,由于上图中的任务只为每个用户接收一个操作(我们刚刚启动了应用程序),因此不需要评估模式。最后,keyed state中用户的上一个操作将更新为最新的操作,以便在同一用户的下一个操作行为到达时能够进行查找。

image.png

在前三个操作行为被处理了之后,下一个事件,即用户1001的注销操作,将被发送到处理用户1001的并发实例中。当并发实例接收到用户操作的数据时,它从广播状态和用户1001的上一个操作中查找当前的模式。由于这两个操作符合模式匹配,因此会往下游发送匹配事件。最后,该任务会通过使用最新的操作来覆盖前一个事件以更新其keyed state。

image.png

当一个新模式进入了模式流,它会被广播给所有任务,并且每个并发实例通过使用新模式替换当前模式来更新其广播状态。

image.png

一旦广播状态更新为新模式,那么匹配逻辑将像以前一样继续执行,即用户操作行为事件按键(key)进行分区,并由负责的并发实例进行评估。

如何实现广播状态的应用程序呢?

到目前为止,我们在概念上讨论了应用程序,并解释了如何使用广播状态来评估事件流上的动态模式。接下来,我们将展示如何使用Flink的DataStream API和广播状态功能实现该实例的程序代码。

让我们从程序的输入数据开始。有两个数据流:操作行为流和模式流,在这一点上,我们并不关心数据流从何而来。这些流可以从Apache Kafka、Kinesis或任何其它系统中获取。

image.png

Action 和 Pattern都是POJO,每个都含有两个字段:
• Action的字段: Long userId, String action
• Pattern的字段: String firstAction, String secondAction
作为第一步,我们将 userId作为操作行为流上的键。

image.png

接下来,我们准备广播状态。广播状态通常表示为MapState,这是Flink提供的最通用的状态接口类。
image.png

由于这个应用程序一次只评估和存储一个Pattern,所以我们将广播状态配置成具有键类型Void和值类型Pattern的MapState。MapState的键永远为 null。
image.png

以 MapStateDescriptor为参数,调用模式流上的broadcast 转换操作,得到一个 BroadcastStream对象 bcedPatterns。
image.png

在获得了 keyedstreamactionsByUser和广播流 bcedPatterns之后,我们对两个流使用了connect()方法,并在连接的流上调用了PatternEvaluator类(见下面PatternEvaluator的代码)。PatternEvaluator是实现KeyedBroadcastProcessFunction接口的自定义类。它调用了我们之前讨论过的模式匹配逻辑,并发出Tuple2的记录,其中包含用户ID和匹配的模式。

image.png

KeyedBroadcastProcessFunction接口提供了三种方法来处理数据记录和发出的结果:

• processBroadcastElement()方法:每次收到广播流的记录时会调用。在PatternEvaluator类中,我们只需使用null键将接收到的Pattern记录放入广播状态中(记住,我们只在MapState中存储一个模式);

• processElement()方法:接受到用户行为流的每条消息时会调用。并能够对广播状态进行只读操作,以防止导致跨越类中多个并发实例的不同广播状态的修改。PatternEvaluator类的processElement()方法从广播状态中获取当前模式,并从keyed state中获取用户的前一个操作。如果两者都存在,它会检查前一个和当前的操作行为是否与模式匹配,如果是这样,则会发出模式匹配记录。最后,它将keyed state更新为当前用户操作;

• onTimer()方法:当之前注册过的计时器触发时被调用。计时器可以在processElement方法中定义,用于执行计算或是清除状态。为了保持代码的简洁性,我们没有在例子中实现这个方法。但是,当用户在某段时间内没有操作时,它可以用来删除最后一个操作,以避免由于非活动用户而导致状态增长;
你可能注意到了KeyedBroadcastProcessFunction类方法的上下文对象,提供了对其它功能的访问方法,例如:

• 广播状态(读写或只读,取决于方法)
• TimerService,允许访问记录的时间戳、当前的水印,并可以注册计时器
• 当前键(仅在processElement()方法中可用)
• 一种将函数应用于每个已注册键的keyed state的方法(仅在processBroadcastElement()方法中可用)
KeyedBroadcastProcessFunction类与其它任何ProcessFunction类一样,完全可以调用Flink的状态和时间功能,因此可以用于实现复杂的程序逻辑。广播状态被设计成了多功能,能够适应不同的场景和用例。虽然我们只讨论了一个比较简单的应用程序,但是你可以通过多个方式使用广播状态来实现应用的需求。

结论

在本文中,我们通过学习一个应用程序的实例,来解释ApacheFlink的广播状态是什么,以及如何应用它来评估事件流上的动态模式。我们还讨论了它的API,并展示了相关的源代码。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
12天前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
292 33
The Past, Present and Future of Apache Flink
|
2月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
846 13
Apache Flink 2.0-preview released
|
2月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
90 3
|
3月前
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
433 31
Apache Flink 流批融合技术介绍
|
2月前
|
分布式计算 监控 大数据
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
81 1
|
2月前
|
数据挖掘 物联网 数据处理
深入探讨Apache Flink:实时数据流处理的强大框架
在数据驱动时代,企业需高效处理实时数据流。Apache Flink作为开源流处理框架,以其高性能和灵活性成为首选平台。本文详细介绍Flink的核心特性和应用场景,包括实时流处理、强大的状态管理、灵活的窗口机制及批处理兼容性。无论在实时数据分析、金融服务、物联网还是广告技术领域,Flink均展现出巨大潜力,是企业实时数据处理的理想选择。随着大数据需求增长,Flink将继续在数据处理领域发挥重要作用。
179 0
|
2月前
|
消息中间件 druid Kafka
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
96 0
|
SQL 架构师 API
《Apache Flink 知其然,知其所以然》系列视频课程
# 课程简介 目前在我的公众号新推出了《Apache Flink 知其然,知其所以然》的系列视频课程。在内容上会先对Flink整体架构和所适用的场景做一个基础介绍,让你对Flink有一个整体的认识!然后对核心概念进行详细介绍,让你深入了解流计算中一些核心术语的含义,然后对Flink 各个层面的API,如 SQL/Table&DataStreamAPI/PythonAPI 进行详细的介绍,以及
1371 0
《Apache Flink 知其然,知其所以然》系列视频课程
|
4月前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
50 1
|
3月前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。

推荐镜像

更多