举个例子,当用户停止任务、更新代码逻辑并且改变任务并发度时,两种 state 都是怎样进行恢复的
1. 区分 operator-state 和 keyed-state 的方式
a. operator-state:
1. 状态适用算子:所有算子都可以使用 operator-state,没有限制。
2. 如果需要使用 operator-state,需要实现 CheckpointedFunction 或 ListCheckpointed 接口
3. DataStream API 中,operator-state 提供了 ListState、BroadcastState、UnionListState 3 种用户接口
4. 状态的存储粒度:以单算子单并行度粒度访问、更新状态
5. 并行度变化时:
a. ListState:均匀划分到算子的每个 sub-task 上
b. BroadcastState:每个 sub-task 的广播状态都一样
c. UnionListState:将原来所有元素合并,合并后的数据每个算子都有一份全量状态数据
b. keyed-state:
1. 状态适用算子:keyed-stream 后的算子使用。注意这里很多同学会犯一个错误,就是大家会认为 keyby 后面跟的所有算子都使用的是 keyed-state,但这是错误的 ,比如有 keyby.process.flatmap,其中 flatmap 中使用状态的话是 operator-state
2. 从 context 接口获取具体的 keyed-state
3. DataStream API 中,keyed-state 提供了 ValueState、MapState、ListState 等用户接