Flink的State
有状态的计算是流式计算框架的一个重要功能,很多复杂的计算场景都需要记录一下相关的状态。Flink State一种为了满足算子计算时需要历史数据需求的,使用 checkpoint 机制进行容错,存储在 state backend 的数据结构。
1.State分类
Flink State被分为keyedstate、operatorstate、BroadcastState三种;keyedstate主要应用在keystream上,它的特点是同一个子任务的同一个key共享同一个state;另一个operatorstate主要应用应用在source和sink,它的特点是同一个子任务共享同一个state。BroadcastState同一个算子的多个 sub task 共享一个 state。
2.state数据结构
state的数据结构包含ValueState 、MapState 、ListState三种结构。
ValueState 存储单个值,访问接口可能有两种,get 和 set,在 State 上体现的是 update(T) / T value()。 MapState 的状态数据类型是 Map,在 State 上有 put、remove等。 ListState 状态数据类型是 List,访问接口如 add、update 等。
存储大的对象时要慎用ValueState 。
3.state存储介质
state可以存储到内存、文件、RocksDB。
基于内存的 MemoryStateBackend,状态存储在内存中,cp存储到jobmanager的内存中。
基于 HDFS 或 OSS 的 FsStateBackend,状态存储在taskmanger的内存中,在做 cp(checkpoint)时存到文件系统,文件系统可以是HDFS。
基于 RocksDB 的 RocksDBStateBackend,将对象序列化成二进制存在内存和本地磁盘的 RocksDB 数据中,并在 cp 时存到文件系统,文件系统可以是HDFS。