我正在为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();
基于这样的想法,我想在定义的时间后清除所有键的所有状态。
我的问题是:
- 我现在正在进行正确的配置吗
- 最好的方法是什么
再次感谢。亲切问候!!!
我对您的用例了解不多,无法推荐特定的过期/清理策略,但我可以提供一些注意事项。
我的理解是,cleanupFullSnapshot()
指定除了正在进行的任何其他清理之外,每当拍摄快照时都将进行完全清理。
FsStateBackend使用增量清理策略。默认情况下,它在每个状态访问期间检查5个条目,并且在记录处理期间不进行额外的清理。如果您的工作负载使得写入比读取多得多,那么这可能还不够。如果未对状态进行访问,则过期状态将持续存在。选择cleanupIncrementally(10, false)
将使清理更加积极,假设您确实有某种级别的状态访问正在进行
检查点的规模增长,或者达到平稳期所需的时间比你预期的要长,这并不罕见。难道仅仅是密钥空间在增长吗?
https://flink.apache.org/2019/05/19/state-ttl.html是一个很好的资源来学习更多关于Flink的状态TTL机制。