Flink系列之:Flink 1.8.0 中的状态 TTL:如何在 Apache Flink 中自动清理应用程序状态

Flink系列之:Flink 1.8.0 中的状态 TTL:如何在 Apache Flink 中自动清理应用程序状态

  • 一、状态的瞬态性质
  • 二、用于持续清理应用程序状态的状态 TTL
  • 三、倒垃圾
  • 四、保持完整状态快照干净
  • 五、堆状态后端的增量清理
  • 六、RocksDB 后台压缩以过滤掉过期状态
  • 七、使用计时器进行急切的状态清理
  • 八、未来的工作
  • 九、总结

许多有状态流应用程序的常见要求是自动清理应用程序状态,以有效管理状态大小,或控制应用程序状态可以访问的时间(例如,由于 GDPR 等法律法规)。状态生存时间 (TTL) 功能在 Flink 1.6.0 中启动,并在 Apache Flink 中启用应用程序状态清理和高效的状态大小管理。

在这篇文章中,我们将激发 State TTL 功能并讨论其用例。此外,我们还展示了如何使用和配置它。我们解释了 Flink 如何在内部使用 TTL 管理状态,并介绍了 Flink 1.8.0 中该功能的一些令人兴奋的新增功能。这篇博文最后展望了未来的改进和扩展。

一、状态的瞬态性质

状态只能维持有限的时间有两个主要原因。例如,让我们想象一个 Flink 应用程序,它摄取用户登录事件流并为每个用户存储上次登录的时间,以改善频繁访问者的体验。

  • 控制状态的大小。能够有效管理不断增长的状态大小是状态 TTL 的主要用例。通常,当数据周围有一些用户活动时,数据需要暂时保留,例如网络会话。当活动结束时,人们不再对该数据感兴趣,但它仍然占用存储空间。 Flink 1.8.0 引入了基于 TTL 的旧状态后台清理功能,可以轻松驱逐不再需要的数据。以前,应用程序开发人员必须采取额外的操作并显式删除无用的状态以释放存储空间。这种手动清理过程不仅容易出错,而且比新的惰性删除状态方法效率低。按照我们之前存储上次登录时间的示例,一段时间后可能不需要这样做,因为稍后可以将用户视为“不频繁”。
  • 遵守数据保护和敏感数据要求。围绕数据隐私法规的最新发展,例如欧盟推出的通用数据保护法规 (GDPR),使得遵守此类数据要求或处理敏感数据成为许多用例和应用程序的首要任务。此类用例的一个示例包括需要在特定时间范围内保留数据并在此后阻止对其进行访问的应用程序。对于向客户提供短期服务的公司来说,这是一个常见的挑战。状态 TTL 功能保证了应用程序可以访问状态的时间长度,因此有助于遵守数据保护法规。

这两个要求都可以通过一个功能来解决,该功能一旦密钥变得不必要或不重要,就会定期但连续地删除密钥的状态,并且不再需要将其保留在存储中。

二、用于持续清理应用程序状态的状态 TTL

Apache Flink 1.6.0 版本引入了 State TTL 功能。它使流处理应用程序的开发人员能够将运算符的状态配置为在定义的超时(生存时间)后过期并清除。在 Flink 1.8.0 中,该功能得到了扩展,包括持续清理 RocksDB 和堆状态后端(FSStateBackend 和 MemoryStateBackend)的旧条目,从而实现旧条目的持续清理过程(根据 TTL 设置)。

在 Flink 的 DataStream API 中,应用程序状态由状态描述符定义。状态 TTL 是通过将 StateTtlConfiguration 对象传递给状态描述符来配置的。以下 Java 示例演示如何创建状态 TTL 配置并将其提供给状态描述符,该状态描述符将用户的上次登录时间保存为 Long 值:

import org.apache.flink.api.common.state.StateTtlConfig;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.api.common.state.ValueStateDescriptor;StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.days(7)).setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite).setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired).build();ValueStateDescriptor<Long> lastUserLogin = new ValueStateDescriptor<>("lastUserLogin", Long.class);lastUserLogin.enableTimeToLive(ttlConfig);

这段代码使用Apache Flink提供的StateTtlConfig来设置状态的TTL(Time-To-Live)配置。

  • 首先,导入必要的包org.apache.flink.api.common.state.StateTtlConfig、org.apache.flink.api.common.time.Time和org.apache.flink.api.common.state.ValueStateDescriptor。
  • 然后,创建StateTtlConfig对象ttlConfig,并使用StateTtlConfig.newBuilder(Time.days(7))来指定TTL的时间长度为7天。这意味着状态数据的最大生存时间为7天。
  • 接下来,调用ttlConfig的setUpdateType方法,将UpdateType设置为StateTtlConfig.UpdateType.OnCreateAndWrite。这表示在创建和写入状态时更新TTL。
  • 然后,调用ttlConfig的setStateVisibility方法,将StateVisibility设置为StateTtlConfig.StateVisibility.NeverReturnExpired。这表示状态在过期后永远不会返回,也就是被清理后不会再被读取。
  • 最后,使用ValueStateDescriptor创建一个名为"lastUserLogin"的状态描述符lastUserLogin,并调用lastUserLogin的enableTimeToLive方法,将ttlConfig传递给它。这将启用状态的TTL配置。
  • 通过配置TTL,可以控制状态的生存时间,以及何时更新和清理状态。这有助于管理状态数据的存储和性能。在这个例子中,状态"lastUserLogin"的过期时间为7天,并且在创建和写入状态时更新TTL。

Flink 提供了多个选项来配置状态 TTL 功能的行为。

  • 生存时间何时重置?默认情况下,状态条目的过期时间会在状态修改时更新。或者,也可以在读取访问时更新它,但需要执行额外的写入操作来更新时间戳。
  • 过期状态可以最后一次访问吗?状态 TTL 采用惰性策略来清理过期状态。这可能会导致应用程序尝试读取已过期但尚未删除的状态。您可以配置此类读取请求是否返回过期状态。无论哪种情况,过期状态都会立即被删除。虽然返回过期状态的选项有利于数据可用性,但数据保护法规可能需要不返回过期状态。
  • 生存时间计时器使用哪些时间语义?在 Flink 1.8.0 中,用户只能根据处理时间定义状态 TTL。计划在未来的 Apache Flink 版本中支持事件时间。

在内部,状态 TTL 功能是通过存储最后一个相关状态访问的附加时间戳以及实际状态值来实现的。虽然这种方法增加了一些存储开销,但它允许 Flink 在状态访问、检查点、恢复或专用存储清理过程期间检查过期状态。

三、倒垃圾

当读操作访问状态对象时,Flink 会检查其时间戳,如果过期则清除状态(根据配置的状态可见性,是否返回过期状态)。由于这种惰性删除,不再被访问的过期状态将永远占用存储空间,除非它被垃圾收集。

那么,在应用程序逻辑不明确处理的情况下,如何删除过期状态呢?一般来说,有不同的可能策略可以在后台将其删除。

四、保持完整状态快照干净

Flink 1.6.0 已经支持在拍摄检查点或保存点的完整快照时自动驱逐过期状态。请注意,状态驱逐不适用于增量检查点。必须显式启用完整快照的状态驱逐,如下例所示:

StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.days(7)).cleanupFullSnapshot().build();

本地存储保持不变,但存储快照的大小减小。仅当操作员从快照重新加载其状态时,即在恢复或从保存点启动时,操作员的本地状态才会被清除。

由于这些限制,在 Flink 1.6.0 中应用程序仍然需要在状态过期后主动删除状态。为了改善用户体验,Flink 1.8.0 引入了两种更多的自主清理策略,针对 Flink 的两种状态后端类型各一种。我们在下面描述它们。

五、堆状态后端的增量清理

此方法特定于堆状态后端(FSStateBackend 和 MemoryStateBackend)。这个想法是存储后端在所有状态条目上保留一个惰性全局迭代器。某些事件(例如状态访问)会触发增量清理。每次触发增量清理时,迭代器都会前进。遍历的状态条目会被检查,一旦被删除就会过期。以下代码示例展示了如何启用增量清理:

StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.days(7))// check 10 keys for every state access.cleanupIncrementally(10, false).build();

如果启用,每个状态访问都会触发清理步骤。对于每个清理步骤,都会检查一定数量的状态条目是否过期。有两个调整参数。第一个定义了每个清理步骤要检查的状态条目数。第二个参数是一个标志,用于在每个处理的记录之后以及每个状态访问之后触发清理步骤。

这种方法有两个重要的注意事项:

  • 第一个是增量清理所花费的时间增加了记录处理延迟。
  • 第二个几乎可以忽略不计,但仍然值得一提:如果没有访问任何状态或没有处理任何记录,则不会删除过期状态。

六、RocksDB 后台压缩以过滤掉过期状态

如果您的应用程序使用 RocksDB 状态后端,您可以启用另一种基于 Flink 特定压缩过滤器的清理策略。 RocksDB 定期运行异步压缩来合并状态更新并减少存储。 Flink 压缩过滤器使用 TTL 检查状态条目的过期时间戳,并丢弃所有过期值。

激活此功能的第一步是通过设置以下 Flink 配置选项来配置 RocksDB 状态后端:state.backend.rocksdb.ttl.compaction.filter.enabled。配置 RocksDB 状态后端后,将为状态启用压缩清理策略,如以下代码示例所示:

StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.days(7)).cleanupInRocksdbCompactFilter().build();

请记住,调用 Flink TTL 过滤器会减慢 RocksDB 压缩速度。

七、使用计时器进行急切的状态清理

另一种手动清理状态的方法是基于 Flink 计时器。社区目前正在评估这个想法以用于未来的版本。通过这种方法,为每个状态访问注册一个清理计时器。这种方法更具可预测性,因为状态一旦过期就会被立即删除。然而,它更昂贵,因为计时器消耗存储以及原始状态。

八、未来的工作

除了上面提到的基于定时器的清理策略之外,Flink 社区还计划进一步改进状态 TTL 功能。可能的改进包括添加对事件时间尺度的 TTL 支持(目前仅支持处理时间)以及为可查询状态启用状态 TTL。

九、总结

基于时间的状态访问限制和控制应用程序状态的大小是有状态流处理领域的常见挑战。 Flink 1.8.0 版本通过添加对过期状态对象的持续后台清理的支持,显着改进了状态 TTL 功能。新的清理机制使您无需手动实施状态清理。由于他们的懒惰本性,他们也更有效率。状态 TTL 使您可以控制应用程序状态的大小,以便您可以专注于应用程序的核心逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12.5,12.15AVL树更新,定义,插入

定义平衡因子为右子树高度减去左子树高度 AVL树插入分为两步&#xff1a; 按照二叉搜索树的方式插入新节点调整平衡因子 对于平衡因子的调整&#xff0c;在插入之前&#xff0c;所有节点的平衡因子分为三种情况&#xff1a;0&#xff0c;1&#xff0c;-1插入后&#xff0c;新…

EasyExcel 简单导入

前边写过使用easyexcel进行简单、多sheet页的导出。今天周日利用空闲写一下对应简单的导入。 重点&#xff1a;springboot、easyExcel、桥接模式&#xff1b; 说明&#xff1a;本次使用实体类student&#xff1a;属性看前边章节内容&#xff1b; 1、公共导入service public …

ArkTS编译时遇到arkts-no-obj-literals-as-types错误【Bug已解决-鸿蒙】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2此Bug解决方案总结项目场景: 在开发鸿蒙项目过程中,遇到了arkts-no-obj-literals-as-types,总结了自己和网上人的解决方案,故写下这篇文章。 遇到问题: rkTS编译时遇到arkts-no-obj-literals-as-type…

【数据结构】(二叉树)计算结点|叶子结点|高度|第K层结点数

目录 概念&#xff1a; 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的创建 二叉树遍历 前序&#xff1a; 中序&#xff1a; 后序&#xff1a; 计算结点数 计算叶子结点数 计算树的高度&#xff08;深度&#xff09; 计算第K层结点数 概念&#xff1a; 一颗…

PVE系列-防火墙的免费安静之旅IPfire

Ventoy一款引导盘可以引导各种启动盘安装盘的工具https://www.ventoy.net/cn/index.html 在它的兼容iso的列表 中发现了Ipfirehttps://wiki.ipfire.org/ &#xff0c;本来用着openwrt也挺好&#xff0c;忍不住的虚拟机尝了尝鲜&#xff0c;发现的功能有2&#xff0c; 安全吧&a…

虚拟化之安全虚拟化

虚拟化首次引入是在Armv7-A架构中。那时&#xff0c;Hyp模式&#xff08;在AArch32中相当于EL2&#xff09;仅在非安全状态下可用。当Armv8.4-A引入时&#xff0c;添加了对安全状态下EL2的支持作为一个可选特性。 当处理器支持安全EL2时&#xff0c;需要使用SCR_EL3.EEL2位从E…

React 表单与事件

大家好&#xff0c;欢迎来到 React 表单与事件课程。在这一课中&#xff0c;我们将学习如何在 React 中使用表单和事件。 表单 在 HTML 中&#xff0c;表单元素用于收集用户输入。在 React 中&#xff0c;表单元素与其他 DOM 元素有所不同&#xff0c;因为它们会保留一些内部…

linux文件打包和压缩

7.2 文件打包和压缩 7.2.1 tar tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。 ​ tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 ​ tar命令是Unix/Linux系统中备给文件的…

NetSuite 智能商品推荐(Intelligent Recommendations)

本周在一个客户环境里&#xff0c;发现销售订单中有个Intelligent Recommendations的按钮。 本以为是客户新装的一个SuiteApp&#xff0c;仔细研究一下发现还不是。是个我们忽略的一个内建新功能。 Intelligent Recommendations&#xff0c;是2023.1版本推出的新功能。主要目的…

PHP代码审计之实战审代码篇1

本章代码来之各种php的cms历史漏洞源码&#xff0c;供小伙伴们学习, 本次三题 1. 仔细观察如下代码&#xff0c;思考代码有什么缺陷&#xff0c;可能由此引发什么样的问题&#xff1f; //检测旧密码是否正确 if($password ! ) {$oldpassword md5(md5($oldpassword));$r $do…

Qt 表格相关API

1.文本框 限制输入数据类型&#xff08;如仅英文&#xff09; QValidator* validator new QRegExpValidator(QRegExp("[a-zA-Z]"), lineText); // 创建正则表达式验证器lineText->setValidator(validator); // 将验证器设置给 QLineEdit QLineEdit&#xff1a;单…

(2023|ICLR,文本反演,LDM,伪词)一个词描述一张图像:使用文本反演个性化文本到图像的生成

An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion 公纵号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方…

react内置组件之<StrictMode></StrictMode>

1、作用&#xff1a; <StrictMode> 是 React 提供的一个组件&#xff0c;用于帮助开发者在开发过程中检测潜在的问题&#xff0c;并修复一些常见的警告。 使用 <StrictMode> 组件包裹应用程序或组件可以启用一些额外的检查和警告。它可以帮助你捕获可能的错误、发…

QSqlQueryModel

QSqlQueryModel 是 Qt 框架中的一个模型类&#xff0c;用于在 Qt 的视图组件&#xff08;如 QTableView、QListView&#xff09;中显示数据库查询结果。 QSqlQueryModel 继承自 QAbstractTableModel&#xff0c;它通过执行 SQL 查询并将结果存储在内部数据结构中&#xff0c;提…

Vue 2.x跟Vue 3.x有啥区别

大家好&#xff0c;我是咕噜-凯撒&#xff0c;我们都知道Vue 是一款比较流行的前端JavaScript 框架&#xff0c;在他演进的过程中出现了2个主要版本&#xff0c;Vue 2.x 和 Vue 3.x。这两个版本之间有很多的区别&#xff0c;下面我以自己的理解介绍一下他们之间的区别。 响应性…

thinkphp8.0是否兼容thinkphp5.0?

ThinkPHP 8.0 是 ThinkPHP 框架的一个较新版本&#xff0c;而 ThinkPHP 5.0 是其前一个主要版本。每当框架进行主要版本升级时&#xff0c;都会有许多变化&#xff0c;可能包括对现有功能的改进、新功能的添加以及不再支持旧功能。这些变化可能会导致与以前版本的不兼容。 Thi…

流行的 React 相关库和框架

React 本身就是一个非常流行的 JavaScript 库&#xff0c;用于构建用户界面&#xff0c;特别是单页面应用。不过&#xff0c;有许多其他的库和框架与 React 结合使用&#xff0c;以提供额外的功能和优化开发体验。以下是一些最流行的 React 相关库和框架&#xff1a; Next.js&a…

开源的数据流技术,该选择Redpanda还是Apache Kafka?

本文将比较Apache Kafka和Redpanda两种开源的数据流技术&#xff0c;在云原生实时处理能力上的不同&#xff0c;以及如何在项目中做出选择。 目前&#xff0c;Apache Kafka不但成为了数据流处理领域事实上的标准&#xff0c;而且带动了同类产品的出现。Redpanda就是其中之一…

DeCap DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING

DeCap: DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING 论文&#xff1a;https://arxiv.org/abs/2303.03032 代码&#xff1a;https://github.com/dhg-wei/DeCap OpenReview&#xff1a;https://openreview.net/forum?idLt8bMlhiwx2 TL; DR&#xff…

AIGC(生成式AI)试用 15 -- 小结

断断续续的尝试在实际的工作使用中理解和测试AIGC&#xff0c;运用会越来越多、越来越广范&#xff0c;但也是时候做个小结了。 没有太用热火的ChatGPT&#xff0c;只是拿了日常最容易用到的CSDN创作助手&#xff08;每周写文章总是看到&#xff09;和文心一言&#xff08;…