关于StateTtlConfig

问题描述

我正在为MapState配置StateTtlConfig,我感兴趣的是进入状态的对象有3个小时的生命,然后它们应从状态中消失并传递给GC进行清理并释放一些内存和检查点我认为也应该释放一些重量。我之前有此配置,但似乎无法正常工作,因为检查点始终在增长:

private final StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(org.apache.flink.api.common.time.Time.hours(3)).cleanupFullSnapshot().build();

然后,我意识到该配置仅在从保存点读取状态时有效,而在我的方案中不起作用。我将TTL配置更改为此:

private final StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(org.apache.flink.api.common.time.Time.hours(3))
            .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired).build();

基于这样的想法,我想在定义的时间后清除所有键的所有状态。

我的问题是:

  1. 我现在正在正确配置吗?
  2. 最好的方法是什么?

再感谢一次。 问候!

解决方法

对于您的用例,我还不够了解,无法推荐特定的到期/清除策略,但是我可以提供一些注意事项。

我的理解是cleanupFullSnapshot()指定除了正在执行的其他任何清理工作之外,无论何时拍摄快照,都将进行完全清理。

FsStateBackend使用增量清理策略。默认情况下,它在每个状态访问期间检查5个条目,并且在记录处理期间不进行其他清理。如果您的工作量使得写入的次数多于读取的次数,那可能还不够。如果对该状态没有访问权限,则过期状态将继续存在。假设您确实需要进行某种级别的状态访问,那么选择cleanupIncrementally(10,false)将使清除工作更具攻击性。

检查点大小增加,或者花费比预期达到稳定水平更长的时间并不罕见。仅仅是因为键空间在增长吗?

https://flink.apache.org/2019/05/19/state-ttl.html是学习Flink的状态TTL机制的好资源。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...