标签:一个 输出 ken nio 相同 tor 支持 组件 point
状态可以是历史结果,也可以是存储的数据,归根揭底是保存的内容就是状态。
流式计算分为有状态的和无状态的:
无状态的流处理:观察每个独立的事件,并根据最后一个事件的结果进行输出。
有状态的流处理:基于多个事件输出结果。流与流之间的关联操作、流与静态表或动态表之间的关联操作都是有状态的。
Operator State 算子状态: 可用于多种算子,通常用于Source,流入到该算子的数据可以访问和更新对应的状态。每个算子的子任务对应一个状态,且每个子任务间的状态不能互相访问。
算子状态的基本数据结构:
Keyed State 键控状态:只适用于KeyedStream上的算子,每个Key对应一个状态,具有相同key的所有数据都会访问相同的状态。
键控状态的基本数据结构:
ValueState: 保存单个值,每个Key都有一个状态,设置:‘update(T)‘,获取:‘get(T)‘。
ListState: 保存元素列表,每个列表有一个状态。添加:‘add(T)‘,获取:‘get(T)‘。
MapState:存储键值对列表,每个Map对应一个状态。与Map的使用相同。
ReduceState:存储单个值, 表示把所有元素的聚合结果添加到状态中,使用add时需要指定ReduceFunction进行聚合。
AggregatingState:存储单个值,与ReducingState类似,都是进行聚合.但是AggregatingState的聚合的结果和元素类型可以不一样.
注意:所有类型的clear()方法都只能清空当前key的状态。
状态后端主要负责两件事:本地状态管理(TaskManager)、将检查点状态写入远程存储。
状态的存储、访问和维护由可插入的组件状态后端决定。
为什么要维护本地状态?
输入的每条数据都会触发带状态的算子读取和更新状态,有效的状态访问对于处理数据的低延时非常重要,所以要维护本地状态以确保快速访问状态。
状态后端分类:
MemoryStateBackend>
存储方式:本地状态存储在TaskManager的内存,Checkpoint存储在JobManager的内存,都是内存。
特点:速度最快,但是不安全,故障时会数据丢失。
FsStateBackend>
存储方式:本地状态存储在TaskManager的内存,Checkpoint存储在外部文件系统,如HDFS。
特点:拥有内存级别的本地访问速度,和更好的容错保证,但是由于内存有限,数据量特别大时可能会OOM。
RocksDBStateBackend>
存储方式:本地状态存储在TaskManager的RocksDB数据库中,采用内存+磁盘,Checkpoint存储在外部文件系统。特点:所有状态序列化之后存储在本地KV形式的RocksDB数据库中,支持超大状态作业,要求作业读写性能不高。
说明:RocksDBStateBackend单机,Flink内置无需安装,且唯一支持增量检查点。
注:Flink多并行度下是不支持使用变量的,因为每个并行度都共享一份变量,而每个并行度中的不同分组同时拥有这份变量数据,这就会导致分组间的数据无法隔离,即使分了组不同的组之间使用的都是这份变量。因此凡是用到变量的地方都需要用状态替换。
标签:一个 输出 ken nio 相同 tor 支持 组件 point
原文地址:https://www.cnblogs.com/yuexiuping/p/14837681.html