声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
2. 由于是个人总结, 所以用最精简的话语来写文章
3. 若有错误不当之处, 请指出
状态就是一块内存, 一个变量, 如果要访问历史窗口(或批次)的数据时就需要用到状态, 把历史窗口(或批次)的数据处理结果值保存到状态里;
并且带有自动做检查点存储的功能
无状态算子: map
有状态算子: sum, reduce 后面数据需要用到前面数据的聚合中间结果
无状态的计算一般是基于一个独立事件输出结果, 如温度超过90度时发出警告
有状态的计算一般是基于多个事件输出结果, 如一分钟内收到两个差值超过20度的温度发出警告
没keyBy前的算子状态:没keyBy前的算子状态 对于Task内部(SubTask之间)是共享的, 4个sumTask, 那么每个sumTask就是SubTask, 它们属于同一个Task
定义一个没keyBy前的算子状态, 得实现ListCheckedPoint接口
**列表状态(**List State)
状态数据用一个List存储, 程序恢复时, 将List拆分成一个个 单个元素 分发给各个TaskManager
联合列表状态(Union List State)
状态数据用一个List存储, 但程序恢复时, 将List分别发给各个TaskManager, 让他们自己去里面挑, 这个不好
广播状态
广播状态是MapState
A流有1个分区, B流有4个分区, B流要用到A流的数据, 所以需要将A流1个分区的数据广播到B流的4个分区, 用的状态类型是MapState
keyBy后的键控状态对于同key事件是共享的
ValueState
get 操作: .value( )set 操作: .update(T value)
ListState
Iterable MapState .get(UK key).put(UK key, UV value).contains(UK key).remove(UK key) ReducingState AggregatingState 自定义聚合操作逻辑, 类似于ReducingState但比其更复杂些, 得实现更多方法
.clear( )是清空操作
API-声明一个状态:@Override
public void open (Configuration parameters) throws Exception {
lastTempState = getRuntimeContext( ).getState(new ValueStateDescriptor("last-temp", Double.class, Double.MIN_VALUE));
}
RocksDB: 基于LSM(内存+磁盘)结构的存储系统
状态后端(StateBackend):负责管理状态, 以及做检查点存储
MemoryStateBackend 状态在内存, 检查点存在内存
FsStateBackend 状态在内存, 检查点存在远程FileSystem
RocksDBStateBackend 状态在内存, 检查点存在本地RocksDB
org.apache.flink flink-statebackend-rocksdb_2.12 1.10.1



