一、状态
1.概述
算子任务可以分为有状态、无状态两种。
- 无状态:filter,map这种,每次都是独立事件
- 有状态:sum这种,每次处理数据需要额外一个状态值来辅助。这个额外的值就叫“状态”
2.状态的分类
(1)托管状态(Managed State)和原始状态(Raw State)
托管状态就是由Flink统一管理的,状态的存储访问、故障恢复和重组等一系列问题都由Flink实现,我们只要调接口就可以。
原始状态则是自定义的,相当于就是开辟了一块内存,需要我们自己管理,实现状态的序列化和故障恢复。
(2)算子状态(Operator State)和按键分区状态(Keyed State)
按键分区状态其实就是被keyBy的算子。
使用Keyed State必须基于KeyedStream。没有进行keyBy分区的DataStream,即使转换算子实现了对应的富函数类,也不能通过运行时上下文访问Keyed State。富函数可以获取运行时上下文。
所有算子都是在本地实例上维护的,并行子任务的状态不共享。
3.按键分区状态
(1)值状态(ValueState)
状态中只保存一个“值”(value)