Apache flink 陈述生存的时间。它如何与ApacheFlink CEP模式一起工作? 我阅读了ApacheFlink关于州生存时间的文档https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/state/state.html#state-生存时间ttl 我不明白有两个时刻。 1)

Apache flink 陈述生存的时间。它如何与ApacheFlink CEP模式一起工作? 我阅读了ApacheFlink关于州生存时间的文档https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/state/state.html#state-生存时间ttl 我不明白有两个时刻。 1),apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,如果我将在15:00时输入ValueState某些元素,然后使用保存点停止我的作业,并且仅在17:00时,我将从最后一个保存点开始我的作业。 价值状态会很清楚,对吗 2) 如果我使用Apache Flink CEP模式: 如果我将在15:00获得一个元素,然后使用保存点停止我的工作,并且仅在17:00,我将从最后一个保存点开始我的工作。并且得到B元素,模式不匹配,对吗 它(ttl)如何与ApacheFlinkCEP模式一起工作 谢谢 我了解CEP,我真的在使用摄取时间。我将尝试解释:我使用带有

如果我将在15:00时输入ValueState某些元素,然后使用保存点停止我的作业,并且仅在17:00时,我将从最后一个保存点开始我的作业。
价值状态会很清楚,对吗
2) 如果我使用Apache Flink CEP模式:

如果我将在15:00获得一个元素,然后使用保存点停止我的工作,并且仅在17:00,我将从最后一个保存点开始我的工作。并且得到B元素,模式不匹配,对吗
它(ttl)如何与ApacheFlinkCEP模式一起工作
谢谢

我了解CEP,我真的在使用摄取时间。我将尝试解释:我使用带有ValueState、timerTime的进程函数,并在onTimer方法中清除状态。我将一些元素放入状态(keyedstate),将计时器设置为1小时,并执行一些逻辑。基本上,值状态+定时器用作输出限制器(1小时内输出1条消息)。在我的公司,我们需要停止在集群上运行作业(使用保存点),然后在几个小时后,我们需要从最后一个保存点重新启动作业。现在我不使用TTL,重新启动后,我的ValueState.value不为null。我希望重新启动后的值状态小于一小时。值不为null(如果我在停止前处于状态),但超过一小时的值状态将始终为null。
P.s我使用RrocksDb状态后端,增量检查点,间隔1s。它工作得很好。))

如果我将在15:00时输入ValueState某些元素,然后使用保存点停止我的作业,并且仅在17:00时,我将从最后一个保存点开始我的作业。 价值状态会很清楚,对吗

(1) 这个ValueState实际上会消失,但我不确定它是否真的会消失。如果您的状态TTL配置包含
cleanupFullSnapshot()
,则如果您在16:00之后获取保存点,则可以保证保存点不会包含有问题的状态。但在本例中,这两种情况似乎都不正确,因此状态在快照中。我不知道在快照还原期间或下次清理期间是否删除了自过期以来的状态。但由于指定了
NeverReturnExpired
,因此不会影响结果

它(ttl)如何与ApacheFlinkCEP模式一起工作

(2) CEP不使用状态TTL。只要可能影响模式匹配,CEP就会保持状态不变,并且在不再需要状态时显式清除状态。从您对这个问题的措辞来看,我假设您使用的是处理时间,而不是事件时间。在这种情况下,模式在60分钟内不会匹配。但是如果要使用事件时间,则水印将用于确定经过了多少时间,停机时间对模式匹配没有影响

更新:


我现在看到,您正在使用摄取时间,并依靠计时器清除状态。对于摄入时间,您可以选择使用事件时间或处理时间计时器。如果使用处理时间计时器,则在作业未运行时应触发的任何计时器将在作业重新启动后立即触发。有了事件时间计时器,一旦水印到达计时器中的时间,它们就会开火。由于水印未保存在保存点中,因此在创建任何水印之前,某些事件必须流动并进行处理(对于周期性水印,自动水印间隔必须经过处理)。

谢谢大家David,我在问题中添加了一些关于我的问题的信息
StateTTLConfig ttl = StateTtlConfig
.newBuilder(Time.minutes(60))
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.build();

//And use in my Process Function 

valueStateDescriptor.enableTimeToLive(ttl);
.begin("a")
.where(simpleConditionA)
.followedBy("b")
.where(simpleConditionB)
.within(Time.minutes(60));