Apache flink 关于Flink中状态的TTL配置

Apache flink 关于Flink中状态的TTL配置,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,假设我有描述符的此配置,并从这里执行操作: ValueStateDescriptor<Event> descriptor = ...; StateTtlConfig ttlConfigOneHourAndReturnExpire = StateTtlConfig.newBuilder(Time.hours(1)) .setUpdateType(StateTtlConfig.UpdateType.OnReadAndWrite) .set

假设我有描述符的此配置,并从这里执行操作:

ValueStateDescriptor<Event> descriptor = ...;

StateTtlConfig ttlConfigOneHourAndReturnExpire = StateTtlConfig.newBuilder(Time.hours(1))
            .setUpdateType(StateTtlConfig.UpdateType.OnReadAndWrite)
            .setStateVisibility(StateTtlConfig.StateVisibility.ReturnExpiredIfNotCleanedUp).build();

descriptor.enableTimeToLive(ttlConfigOneHourAndReturnExpire);

/*after one hour when the state is expired*/
Event e = state.value(); (step 1 and 2)
e.count = e.count + 1; (step 3)
value.update(e); (step 4)
ValueStateDescriptor=。。。;
StateTtlConfig ttlConfigOneHourAndReturnExpire=StateTtlConfig.newBuilder(Time.hours(1))
.setUpdateType(StateTtlConfig.UpdateType.OnReadAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.ReturnExpiredIfNotCleanedUp).build();
descriptor.enableTimeToLive(ttlConfigOneHourAndReturnExpire);
/*一小时后,当状态过期时*/
事件e=state.value();(步骤1和2)
e、 计数=e.计数+1;(步骤3)
更新(e);(步骤4)
这是否意味着在1小时后,当该状态已被弃用时,事情将按以下顺序发生:

  • 返回状态为“已弃用”的记录的上一个状态
  • 读取后,记录的上一个状态将被清除
  • 在上一个状态被传递和清除(以读取方式)后更新对象
  • 在这种情况下,更新状态意味着再次创建状态,因为上一个状态已被删除,此值将需要一个多小时,或者状态将在此时清理,而不是在第1点清理,对象将不包括更新,并且将在到达时以状态存储 我可以解释我自己,因为文件对我来说不清楚

    当一天发生变化时,我需要清理状态,但使用TTL无法做到这一点。从这一点开始,我希望每小时清理一次状态,但在删除之前获得状态,更新当前值,然后再创建一个小时的状态,但在丢失前始终保持以前的状态

    希望这是有意义的,并有可能在某种程度上做到。
    亲切的问候

    如果您需要每小时操纵一次状态,则创建一个自定义的
    ProcessFunction
    ,并使用计时器触发该操作。

    使用
    ProcessFunction
    ,我是否需要声明窗口1小时,以便每小时使用
    onTimer
    方法,然后在不丢失实际状态的情况下清除状态并重新更新值?如果是这样的话,我就不能这样做,因为用例需要尽可能快地触发,而不是每小时触发一次。我使用
    onTimer
    对吗?如果我这样做的话,似乎不需要使用
    KeyedProcessFunction
    来声明
    窗口
    时间:
    long cleanupTime=getEndOfDay()-event.timestamp.getTime();ctx.timerService().registereventtimeter(cleanupTime)
    当方法
    getEndOfDay
    以长格式给我一天中的最后一个时间时,我是否能够在一天结束时清洁我的钥匙?我不理解你的要求。你说过“我想在每小时后清理一次状态”,但在最新的代码片段中,听起来你只是想在每天结束时清理一下。是的,很抱歉让你感到困惑,我需要在一天结束时清理所有状态,然后开始一个完全没有状态的新一天。我用上面的片段做对了吗?亲切的问候!