声明: 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, 让他们自己去里面挑, 这个不好
-
广播状态(BroadcastState)
广播状态的创建要借助MapState
广播流: A流有1个分区, B流有4个分区, B流要用到A流的数据, 所以需要将A流1个分区的数据广播到B流的4个分区, 用的状态类型是MapState
keyBy后的键控状态:
keyBy后的键控状态对于同key事件
是共享的
-
ValueState<T> 保存单个的值
- get 操作: .value( )
- set 操作: .update(T value)
-
ListState<T> 保存一个List集合
- Iterable<T> ListState.get( )
- .update(List<T> values)
- .add(T value)
- ListState.addAll(List<T> values)
-
MapState<K, V> 保存K-V对
- .get(UK key)
- .put(UK key, UV value)
- .contains(UK key)
- .remove(UK key)
-
ReducingState<T> 同时得传入reduce聚合操作逻辑, 每添加数据时便会调用它, 只保存聚合后的结果
-
AggregatingState<I, O> 自定义聚合操作逻辑, 类似于ReducingState但比其更复杂些, 得实现更多方法
.clear( )是清空操作
API-声明一个状态:
@Override
public void open (Configuration parameters) throws Exception {
lastTempState = getRuntimeContext( ).getState(new ValueStateDescriptor<Double>("last-temp", Double.class, Double.MIN_VALUE));
}
从checkpoint恢复时并行度改变, 状态如何重新分配?
算子状态:
- ListState: 将原先所有State中的元素
均匀划分
给新的Task - Union List State: 将原先所有State中的元素
全部
发给新的Task, 每个Task都拥有全量数据 - BroadState State: 将原先所有State中的元素
全部
发给新的Task, 每个Task都拥有全量数据
键控状态:
Key被Redistribute到哪个Task, 对应的Keyed State就被Redistribute到哪个Task
基于Key Group来做分配:
-
numOfKeyGroups=maxParallelism
-
将key分为group (KeyGroup = hash(key)%numOfKeyGroups)
-
将group分配给task实例
RocksDB: 基于LSM(内存+磁盘)结构的存储系统
状态后端(StateBackend):
负责管理状态, 以及做检查点存储
-
MemoryStateBackend 状态在
内存
, 检查点存在内存
-
FsStateBackend 状态在
内存
, 检查点存在远程FileSystem
-
RocksDBStateBackend 状态在
内存
, 检查点存在本地RocksDB
<groupId>org.apache.flink</groupId> <artifactId>flink-statebackend-rocksdb_2.12</artifactId> <version>1.10.1</version>