Flink基础5篇-5-算子状态相关
键值分区状态
经过keyby操作之后,流从dataStream变成keyedStream,此时flink为每一个键值维护一个状态实例。实例会分布在函数所在算子的所有并行任务上。即每个任务负责一部分键值状态的存储。只有作用在keyedStream上的函数才能使用键值分区状态。
键值分区状态目前支持以下原语(状态的数据类型):
- valueState[T]:T类型的单个值
- ListState[T]
- MapState[k,v]
- ReducingStage[T]:和list相同,但每加入一个元素会立即用ReduceFunction计算一次聚合后的值
- AggregatingStage[I,O],和reducing类似,但用aggregateFunction
算子列表状态
算子状态的维护是按照算子并行实例来分配的,因此,每个并行任务在处理任何事件时都可以访问相同的状态。flink支持三种算子状态:
用于指定有状态函数的最底层接口,提供了用于注册和维护键值分区状态和算子状态的钩子函数。也是唯一支持使用算子联合列表状态的接口。该状态在进行任务恢复时需要被完整的复制到每个任务实例上。
状态后端
状态后端负责存储每个状态实例的本地状态。并在生成检查点时将它们写入远程持久化存储。
Flink提供三种状态后端:
- MemoryStateBackend:将状态以对象方式放在TM的JVM堆里。生成检查点时回传给JM,也存在JM的堆内存里。不要用,很容易丢失状态
- FsStateBackend:本地状态也放TM的堆内存,生成检查点时会写入远程的文件存储。受内存大小限制。
- RocksDBStateBackend:将全部状态存到本地的RocksDB实例中,将数据存入本地磁盘存储。生成检查点时也将数据写入远程文件系统。支持增量检查点。配合固态硬盘使用是常见方案。
可查询式状态服务
Flink状态服务包含三个进程:
- QueryableStateClient:外部系统提交查询和返回结果
- QueryableStateClientProxy:接收响应请求,在各个TM节点上
- QueryableStateServer:和状态后端交互,处理请求。也在各个TM节点上
外部系统读写和一致性保障的关系
Flink自身支持精确一次的结果保障,但根据不同的外部数据源和数据汇的特性(外部读写系统),整个流对一致性保障的支持是不同的。
简单讲,可重置数据源+幂等数据汇=精确一次
可重置数据源+2pc(两阶段提交,支持事务)数据汇 = 精确一次
WAL数据汇:写前日志数据汇,先记录所有要写入的数据进日志,收到检查点完成通知后再发送。
YARN下Flink任务的提交
作业模式
作业模式下Flink集群只运行单个作业,作业结束后集群就停止,归还所有资源
会话模式
会话模式下系统会启动一个长期运行的Flink集群,这个集群可以运行多个作业,需要手动停止
集群空闲时:
有任务提交
区别在于client向谁提交任务
- 作业模式提交给Yarn resourceManager(不存在Dispatcher)
- 会话模式提交给Dispatcher
Flink基础5篇-5-算子状态相关
http://www.bake-data.com/2024/04/14/Flink基础5篇-5-算子状态相关/