flink什么时候清理flink cepsql中的idle state?

When will flink clean up idle state in flink cep sql?

我正在使用 flink cep sql 和 blink planner。 这是我的 sql

select * from test_table match_recognize (
   partition by agent_id,room_id,call_type 
   order by row_time // process time
   measures  
       last(BF.create_time) as create_time, 
       last(AF.connect_time) as connect_time 
   one row per match after match SKIP PAST LAST ROW 
   pattern (BF+ AF) WITHIN INTERVAL '10' SECOND 
   define 
       BF as BF.connect_time = 0,
       AF as AF.connect_time > 0  
) as T ;

test_table是卡夫卡table

我设置 table.exec.state.ttl=10000 和 运行 我的程序然后我继续发送消息。

由于我把state ttl和cep interval都设置为10s,所以我启动状态10秒后state的大小应该是固定的。

但事实是状态持续增长至少 15 分钟。此外,jvm触发了两次full gc。

有没有我没有配置的配置?

您不能使用检查点大小来估计状态大小——它们没有任何直接的相关性。检查点可能包括不可预测数量的传输中、过期或未压缩的数据——none 将被计为活动状态。

恐怕没有任何好的工具可用于准确测量您实际拥有多少状态。但是如果你使用的是 RocksDB,那么你可以启用这些指标

state.backend.rocksdb.metrics.estimate-live-data-size
state.backend.rocksdb.metrics.estimate-num-keys

这会给你一个相当准确的估计(但你可能会因为打开它们而付出性能损失)。

至于你对 CEP 状态的担忧——你应该没问题。任何时候你有一个使用 WITHIN 的模式,CEP 应该能够自动清除状态。