Flink状态与容错【状态生存时间TTL,清理过期状态】

一.状态生存时间(TTL)

任何类型的键控状态都可以配置状态的生存期(TTL)。如果配置了TTL且状态值已过期,则将尽力清除存储的值。

所有状态收集类型均支持按条目TTL。这意味着列表元素和映射条目独立过期。

为了使用状态TTL,必须首先构建一个StateTtlConfig配置对象。然后可以通过传递配置在任何状态描述符中启用TTL功能:

import org.apache.flink.api.common.state.StateTtlConfig
import org.apache.flink.api.common.state.ValueStateDescriptor
import org.apache.flink.api.common.time.Time

val ttlConfig = StateTtlConfig
    .newBuilder(Time.seconds(1))
    .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
    .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
    .build
    
val stateDescriptor = new ValueStateDescriptor[String]("text state", classOf[String])
stateDescriptor.enableTimeToLive(ttlConfig)

该配置有几个选项可供考虑:

该newBuilder方法的第一个参数是强制性的,它是生存时间值。

更新类型配置何时刷新状态TTL(默认为OnCreateAndWrite):

  • StateTtlConfig.UpdateType.OnCreateAndWrite -仅在创建和写访问权限时
  • StateTtlConfig.UpdateType.OnReadAndWrite -也具有读取权限

状态可见性用于配置是否清除尚未过期的默认值(默认情况下NeverReturnExpired):

  • StateTtlConfig.StateVisibility.NeverReturnExpired -永不返回过期值
  • StateTtlConfig.StateVisibility.ReturnExpiredIfNotCleanedUp -如果仍然可用,则返回

在NeverReturnExpired的情况下,即使仍必须删除过期状态,其行为也好像不再存在一样。对于严格在TTL之后数据必须变得不可用于读取访问的用例,例如使用隐私敏感数据的应用程序,该选项很有用。

另一个选项ReturnExpiredIfNotCleanedUp允许在清理之前返回过期状态。

笔记:

  • 状态后端与用户值一起存储上次修改的时间戳,这意味着启用此功能会增加状态存储的消耗。堆状态后端将附加的Java对象与对用户状态对象的引用以及原始的long值一起存储在内存中。RocksDB状态后端为每个存储的值,列表条目或映射条目添加8个字节。
  • 当前仅支持有关处理时间的 TTL 。
  • 尝试使用启用了TTL的描述符恢复状态(以前没有配置TTL),反之亦然,这将导致兼容性失败和StateMigrationException。
  • TTL配置不是检查点或保存点的一部分,而是Flink在当前正在运行的作业中如何对待它的一种方式。
  • 仅当用户值序列化程序可以处理空值时,带有TTL的映射状态当前才支持空用户值。如果序列化器不支持空值,则可以用NullableSerializer序列化形式包装一个额外的字节来包装它。

二.清理过期状态

默认情况下,过期的值会在读取时显式删除,例如ValueState#value,并且如果配置的状态后端支持,则会定期在后台收集垃圾。可以在以下位置禁用后台清理StateTtlConfig:

import org.apache.flink.api.common.state.StateTtlConfig
val ttlConfig = StateTtlConfig
    .newBuilder(Time.seconds(1))
    .disableCleanupInBackground
    .build

要对后台的某些特殊清理进行更细粒度的控制,可以按如下所述分别进行配置。当前,堆状态后端依赖于增量清理,而RocksDB后端使用压缩过滤器进行后台清理。

三.完整快照中的清理

此外,可以在拍摄完整状态快照时激活清除操作,这将减小其大小。在当前实现下不会清除本地状态,但是如果从先前的快照还原,则不会包括已删除的过期状态。可以在StateTtlConfig以下位置进行配置:

import org.apache.flink.api.common.state.StateTtlConfig
import org.apache.flink.api.common.time.Time

val ttlConfig = StateTtlConfig
    .newBuilder(Time.seconds(1))
    .cleanupFullSnapshot
    .build

此选项不适用于RocksDB状态后端中的增量检查点。

笔记:

  • 对于现有作业,可以在StateTtlConfig中的任何时间(例如,从保存点重新启动后)激活或取消激活此清除策略。

四.增量清理

另一个选择是逐步触发某些状态条目的清除。触发器可以是来自每个状态访问或每个记录处理的回调。如果此清理策略在特定状态下处于活动状态,则存储后端将在其所有条目上为此状态保留一个惰性全局迭代器。每次触发增量清理时&

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值