Flink State
1、状态(State)
任何一个处理事件流的应用,如果要支持跨多条记录的转换操作,都必须是有状态的,即能够存储和访问中间结果。应用收到事件后可以执行包括读写状态在内的任意计算。
状态是一种运行间的数据信息。这些状态数据在容错恢复及checkpoint时将起到关键作用。
通常意义上,函数里所有需要任务去维护并用来计算结果的数据都属于任务的状态。聚合操作都是有状态的,它们通过将新到来的事件合并到已有状态来生成更新后的聚合值,比如 +1的算子。
2、状态有两种,
算子状态:作用域是某个算子任务,所有在同一个并行任务之内的记录都能访问到相同的状态。算子状态不能通过其他任务访问。
健值分区状态:只能用在KeyedStream,每个key对应一个state
几种KeyedState的关系:
--> ValueState State --> MapState --> ListState --> AppendingState --> MergingState --> ReducingState --> AggregatingState
3、有状态的流式应用的一致性检查点是在所有任务处理完等量的原始输入后对全部任务状态进行的一个拷贝。
数据源能否重置其输入流取决于数据源的具体实现以及所消费外部系统是否提供相关接口。只有所有输入流都是来自于可重置的数据源,应用才支持精确一次的状态的一致性。
根据应用采用的数据汇算子,恢复期间某些结果记录可能会向下游系统(如事件日志系统、文件系统或数据库)发送多次。对Kafka,Flink提供的数据汇函数支持精确一次输出,例如在检查点完成后才会把写出的记录正式提交。
4、P74 讲Chandy-Lamport算法。
所有先于分隔符的记录所引起的状态更改都会被包含在分隔符所对应的检查点之中;而所有晚于分隔符的记录所引起的状态更改都会被纳入之后的检查点之中。
和watermark类似,检查点分隔符总是以广播形式发送,从而可以确保每个任务都能从它们的每个输入都收到一个分隔符。
barrier到达时生成的state是一个时点数,或者在那个时点的累计值。
5、原则上,保存点的生成算法和检查点完全一样,只是保存点需要用户显示触发。
6、可选的状态存储方式
MemoryStateBackend
FsStateBackend
RocksDBStateBackend
reference:
1 《Stream Processing with Apache Flink》
2 https://github.com/flink-china/flink-training-course