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支持三种算子状态:

  • 列表状态
  • 联合列表状态
  • 广播状态

    checkpointedFunction接口

用于指定有状态函数的最底层接口,提供了用于注册和维护键值分区状态和算子状态的钩子函数。也是唯一支持使用算子联合列表状态的接口。该状态在进行任务恢复时需要被完整的复制到每个任务实例上。

状态后端

状态后端负责存储每个状态实例的本地状态。并在生成检查点时将它们写入远程持久化存储。

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-算子状态相关/
Author
shuchen
Posted on
April 14, 2024
Licensed under