当前位置: 首页 > news >正文

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 使您可以控制应用程序状态的大小,以便您可以专注于应用程序的核心逻辑。

相关文章:

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

Flink系列之&#xff1a;Flink 1.8.0 中的状态 TTL&#xff1a;如何在 Apache Flink 中自动清理应用程序状态 一、状态的瞬态性质二、用于持续清理应用程序状态的状态 TTL三、倒垃圾四、保持完整状态快照干净五、堆状态后端的增量清理六、RocksDB 后台压缩以过滤掉过期状态七、…...

2023 亚马逊云科技 re:Invent 大会探秘:Aurora 无限数据库的突破性应用

文章目录 一、前言二、Amazon Aurora 无限数据库2.1 亚马逊云科技数据库产品发展历程2.2 什么是 Amazon Aurora Limitless Database&#xff08;无限数据库&#xff09;2.3 Amazon Aurora Limitless Database 设计架构2.4 Amazon Aurora Limitless Database 分片功能2.5 使用 A…...

IDEA添加Apifox插件后,返回参数不详细解决办法

Apifox官方文档地址(文档中返回的是特殊情况&#xff0c;跟我现在项目的返回不一样&#xff0c;因此需要更改配置) 点击跳转到官方API地址 实现步骤分为两步&#xff1a;第一步&#xff1a;添加配置&#xff0c;第二步使用注解。 1.添加配置 打开Idea设置&#xff0c;添加配置…...

js多图合成一张图

具体思路 先设置画布的宽高&#xff0c;再将每个图片整理成一个对象的数组通过某个方法传出合成后的base64 &#xff08;1&#xff09;、创建一个画布的类&#xff0c;他的属性是canvas虚拟dom和ctx &#xff08;2&#xff09;、构造器初始化convas对象、ctx、convas的宽高 …...

利用原始套接字解决mac地址错误问题【南瑞SysKeeper-2000】

一&#xff1a;案例描述 一键可视顺控图像智能项目在网络部署过程中&#xff0c;对网络限制隔离安全性要求很高&#xff0c;用到正向隔离装置&#xff08;南瑞SysKeeper-2000型号&#xff09;。 图一 正向装置示意图 现场发现问题&#xff1a;直连网线情况下&#xff0c;我方…...

JVM- 为什么G1垃圾回收器需要有大对象区

G1&#xff08;Garbage-First&#xff09;垃圾回收器在Java虚拟机&#xff08;JVM&#xff09;中引入了大对象区&#xff08;也称为Humongous Region或H-Region&#xff09;的概念&#xff0c;主要是为了高效地处理大型对象。在垃圾回收的上下文中&#xff0c;大对象指的是那些…...

操作系统的界面

(1) 请说明系统生成和系统引导的过程。 解&#xff1a; 系统的生成过程&#xff1a;当裸机启动后&#xff0c;会运行一个特殊的程序来自动进行系统的生成&#xff08;安装&#xff09;&#xff0c;生成系统之前需要先对硬件平台状况进行检查&#xff0c;或者从指定文件处读取…...

User 怎么在anaconda的虚拟环境中安装下载好的jieba.tar.gz包呢

...

1.【分布式】分布式事务详解

分布式事务 1.分布式事务是什么&#xff1f;数据库事务 2.分布式事务产生的原因&#xff1f;存储层拆分服务层拆分 3.分布式事务解决方案4.分布式事务有哪些开源组件SeateTCC 分布式服务组件基于消息补偿的最终一致性 5.两阶段提交&#xff0c;三阶段协议详解二阶段提交协议三阶…...

selenium-wire简介

一.简介 以下来自chatGPT回答&#xff1a; selenium-wire是一个基于selenium的Python库&#xff0c;它扩展了selenium的功能&#xff0c;使得我们可以在自动化测试中直接访问和修改浏览器的网络请求和响应。selenium-wire可以拦截和修改HTTP请求和响应&#xff0c;从而可以在…...

华为组播配置案例

igmp-snooping主要用于生成二层组播表项&#xff0c;防止交换机全部接口都发组播报文 PC端配置&#xff1a; 组播源配置&#xff1a; R1 interface GigabitEthernet0/0/0 ip address 10.0.0.1 255.255.255.0 pim dm interface GigabitEthernet0/0/1 ip address 192.168.0…...

lua语法

lua语法 1.lua数据类型 lua 脚本输出乱码&#xff0c;将lua脚本改为UTF-8编码&#xff0c;并且需要DOS下修改代码页&#xff1a;CHCP 65001 即可。 基本语法 注释 print("script lua win")-- 单行注释--[[多行注释]]--标识符 类似于&#xff1a;java当中 变量、…...

5A-Downloader,m3u8文件转mp4文件,音视频分离ts合并、转mp4

获取方式: 1.https://www.pgyer.com/DpxhpE 2.https://github.com/JoeLeeto/5A-Downloader 3.https://play.google.com/store/apps/details?idcom.leet.downloader...

标准IO与文件IO

标准IO通过缓冲机制减少系统调用&#xff0c;实现更高的效率 全缓冲&#xff1a;当流的缓冲区无数据或无空间时才执行实际IO操作 行缓冲&#xff1a;当在输入和输出中遇到换行符&#xff08;\n&#xff09;时&#xff0c;进行IO操作 当流和一个终端关联时&#xff0c;典型的行缓…...

流行的 React 相关库和框架

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

游戏引擎?

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具&#xff0c;其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。大部分都支持多种操作平台&#xff0c;如Linux、…...

C语言--字符函数与字符串函数

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…...

整理了一些热门、含免费次数的api,分享给大家

IP归属地-IPv4区县级&#xff1a;根据IP地址查询归属地信息&#xff0c;包含43亿全量IPv4&#xff0c;支持到中国地区&#xff08;不含港台地区&#xff09;区县级别&#xff0c;含运营商数据。IP应用场景- IPv4&#xff1a;IPv4应用场景是获取IP场景属性的在线调用接口&#x…...

Wireshark在网络性能调优中的应用

第一章&#xff1a;Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧&#xff1a;过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章&#xff1a;网络协议分析 2.1 网络协议分析&#xff1a;TCP、UDP、ICMP等 2.2 高级协议分析&#xff1a;HTTP…...

关于设计师的自我评价(合集)

设计师的自我评价篇一 本人接受过正规的美术教育&#xff0c;具有较好的美术功底及艺术素养&#xff0c;能够根据公司的需要进行设计制作&#xff0c;熟练掌握多种电脑制作软件&#xff0c;能够高效率地完成工作。本人性格开朗、思维活跃、极富创造力&#xff0c;易于沟通&…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...