【发布时间】:2019-01-24 05:38:26
【问题描述】:
就我而言,我只使用 Flink 的可查询状态。特别是,我不关心检查点。
发生事件时,我仅在最多 X 分钟后才查询可查询状态。理想情况下,我会删除“旧”状态以节省空间。
这就是我想知道的原因:我可以用信号通知 Flink 的状态在一段时间后自行清除吗?通过配置?通过特定的事件信号?怎么样?
【问题讨论】:
标签: java scala hdfs apache-flink flink-streaming
就我而言,我只使用 Flink 的可查询状态。特别是,我不关心检查点。
发生事件时,我仅在最多 X 分钟后才查询可查询状态。理想情况下,我会删除“旧”状态以节省空间。
这就是我想知道的原因:我可以用信号通知 Flink 的状态在一段时间后自行清除吗?通过配置?通过特定的事件信号?怎么样?
【问题讨论】:
标签: java scala hdfs apache-flink flink-streaming
清除状态的一种方法是当您不再需要某个特定键的状态对象(例如 ValueState 对象)时,显式调用 clear()。这通常在 ProcessFunction 中的 onTimer() 回调中完成。
另一种可能的方法是使用state time-to-live 来管理其生命周期。
我没有尝试将状态 TTL 与可查询状态一起使用,但我看不出它不应该工作的任何原因。但是,从 Flink 1.7 开始,状态 TTL 仅在访问状态(针对该键)或拍摄完整状态快照时才真正清除状态(针对该键)。因此,在您的特定情况下,这种状态 TTL 机制可能不是很有用。
【讨论】:
clear() 和onTimer() 的文档吗?我不太清楚你所说的“状态对象”是什么意思。我只是用asQueryableState定义我的QueryableStateStream
QueryableStateClient 中的clear()(在读取一次值后立即)。我知道目前不可能;当我尝试使用来自客户端的方法时,我收到了java.lang.UnsupportedOperationException: State is read-only. No modifications allowed。可能这是一个可能的功能请求。 ---- 我会用计时器或 TTL 试试运气并报告。
Flink 1.6 我也相信Flink 1.7)明确不支持可查询状态的 TTL。这就是我得到的:java.lang.IllegalArgumentException: Queryable state is currently not supported with TTL.