在Flink作业中,我想在构造状态24小时后删除内存中的状态。我检查了此post并设置了live(ttl)的状态时间,但是正如本文中提到的,状态删除是延迟/被动的,这可能导致内存泄漏。
例如,在23小时57分钟之后,我收到了关于该密钥的最后一条消息(“ USA”,“ Male”,2018),此后没有再收到该密钥的消息。然后,我将无法调用此键的功能和状态的ttl(“ USA”,“ Male”,2018),然后它将永远保存在内存中。
本文提到使用计时器:
The idea is to register a timer with the TTL per state value and access. When the timer elapses, the state can be cleared if no other state access happened since the timer was registered.
但是我不知道该怎么做。
我正在考虑使用具有ProcessFunction
方法的onTimer()
。我的计划是在ProcessingTimeTimer
方法中注册open()
,并在onTimer()
中删除状态,但是我不知道此计时器是否也被被动触发,这意味着它不会如果甚至在24小时后仍未调用ProcessFunction
,则会触发。
答案 0 :(得分:0)
为此使用ProcessFunction
是个好主意。 ProcessFunction
必定会保留有问题的键控状态,并且会知道对该状态的所有读取和写入,您可以使用该状态以适合您的应用程序的任何方式创建和删除计时器。
计时器被锁定(以与状态被锁定相同的方式),并且处理时间计时器将按计划启动,而不管流活动或该键(或其他键)是否处于活动状态。如果作业在计划的时间由于某种原因停机,则在作业恢复时将触发应在中断期间触发的处理时间计时器。