Flink DataStream State(状态)
一、State(状态)的种类
State有2类:Keyed State和Operator State。
-
Keyed State:与keys相关的状态,仅仅用于Keyed Stream的Operator(算子)的Function。
-
Operator State: Non-Keyed State,每个operator state都绑定到一个并行度算子实例。
当并行度更改时,运算符状态接口支持在并行运算符实例之间重新分配状态。进行这种重新分配可能有不同的Schema。
Keyed State和Operator State都存在2种形式:
- Raw State:是指算子(Operator)保持他们自己数据的结构。当checkpoint时,他们仅仅写入一些列的byte字节。Flink不知道这个状态的数据结构,看到的仅仅是原始的字节bytes。
- Managed State:代表着Flink在运行时期所控制的数据结构。例如内部哈希表,RocksDB。Managed State对象有:
ValueState、ListState、MapState、ReducingState
等。Flink在运行时期对状态进行编码,在checkpoint是写入。
推荐使用Managed State(托管状态)。当程序的并行度发生改变,Flink可以自动重新分发状态。同时Managed State(托管状态)
在内存中管理的更好。
二、State的生存时间(TTL)
如果需要使用State生存时间,你需要在创建Managed State是通过StateTtlConfig对象配置时间。
例如:示例代码
...
StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.seconds(1))
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite