flink之状态生存时间

219 阅读2分钟

flink stream api设置生存时间

 StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.seconds(10))
         .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
         .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
         .build();
 ValueStateDescriptor<String> stateDescriptor = new ValueStateDescriptor<>("mystate", String.class);

 stateDescriptor.enableTimeToLive(ttlConfig);
  • .newBuilder() 状态 TTL 配置的构造器方法,必须调用,返回一个 Builder 之后再调用.build()方法就可以得到 StateTtlConfig 了。方法需要传入一个 Time 作为参数,这就是设定的状态生存时间。
  • .setUpdateType() 设置更新类型。更新类型指定了什么时候更新状态失效时间,这里的 OnCreateAndWrite表示只有创建状态和更改状态(写操作)时更新失效时间。另一种类型 OnReadAndWrite 则表示无论读写操作都会更新失效时间,也就是只要对状态进行了访问,就表明它是活跃的,从而延长生存时间。这个配置默认为 OnCreateAndWrite。
  • .setStateVisibility() 设置状态的可见性。所谓的“状态可见性”,是指因为清除操作并不是实时的,所以当状态过期之后还有可能基于存在,这时如果对它进行访问,能否正常读取到就是一个问题了。这里设置的 NeverReturnExpired 是默认行为,表示从不返回过期值,也就是只要过期就认为它已经被清除了,应用不能继续读取;这在处理会话或者隐私数据时比较重要。对应的另一种配置是 ReturnExpireDefNotCleanedUp,就是如果过期状态还存在,就返回它的值。 除此之外,TTL 配置还可以设置在保存检查点(checkpoint)时触发清除操作,或者配置增量的清理(incremental cleanup),还可以针对 RocksDB 状态后端使用压缩过滤器(compaction filter)进行后台清理。

这里需要注意,目前的 TTL 设置只支持处理时间语义。另外,所有集合类型的状态(例如ListState、MapState)在设置 TTL 时,都是针对每一项(per-entry)元素的。也就是说,一个列表状态中的每一个元素,都会以自己的失效时间来进行清理,而不是整个列表一起清理。

flink sql设置状态的生存时间

在持续查询的过程中,由于用于分组的 key 可能会不断增加,因此计算结果所需要 维护的状态也会持续增长。为了防止状态无限增长耗尽资源,Flink Table API和SQL可以在表环境中配置状态的生存时间(TTL):


TableEnvironment tableEnv = ...  
// 获取表环境的配置  
TableConfig tableConfig = tableEnv.getConfig();  
// 配置状态保持时间  
tableConfig.setIdleStateRetention(Duration.ofMinutes(60));  

// 或者也可以直接设置配置项 table.exec.state.ttl:  
TableEnvironment tableEnv = ...  
Configuration configuration = tableEnv.getConfig().getConfiguration();  
configuration.setString("table.exec.state.ttl", "60 min");