【状态管理一】概览:状态使用、状态分类、状态具体使用

文章目录

    • 一. 状态使用概览
    • 二. 状态的数据类型
      • 1. 算子层面
      • 2. 接口层面
        • 2.1. UML与所有状态类型介绍
        • 2.2. 内部状态:InternalKvState

将知识与实际的应用场景、设计背景关联起来,这是学以致用、刨根问底知识的一种直接方式。

本文介绍

  • 状态数据管理,了解InternalKvState接口的设计以及KeyedState和OperatorState在实现上的区别;
  • 状态数据初始化的流程,了解有状态计算的底层实现原理。

 

一. 状态使用概览

flink中状态存在的意义是什么,涉及到哪些场景。

  1. 实时聚合:比如,计算过去一小时内的平均销售额。这时,你会需要使用到Flink的状态来存储过去一小时内的所有销售数据。
  2. 窗口操作:Flink SQL支持滚动窗口、滑动窗口、会话窗口等。这些窗口操作都需要Flink的状态来存储在窗口期限内的数据。
  3. 状态的持久化与任务恢复:实时任务挂掉之后,为了快速从上一个点恢复任务,可以使用savepoint和checkpoint。
  4. 多流join:Flink至少存储一个流中的数据,以便于在新的记录到来时进行匹配。

 

二. 状态的数据类型

从数据集与接口实现两个层面介绍状态分类,与状态的全部类型

1. 算子层面

分类

根据DataStream数据集是否基于Key进行分组,可将算子中的状态数据分为KeyedState和OperatorState两种类型。

应用位置

  • KeyedState用于经过DataStream.keyby()操作后形成的KeyedStream,并按照Key对状态数据进行分区。
  • OperatorState和并行的算子实例绑定,与数据元素中的Key无关。每个算子实例中都持有一部分状态数据,并支持在算子并行度发生变化时自动重新分配状态数据。

两者区别
【状态管理一】概览:状态使用、状态分类、状态具体使用_第1张图片

 

2. 接口层面

状态数据通过统一的状态接口来表示,并根据不同的状态数据类型和使用方式区分接口实现。如下:

  • MapState:用于存储分区的Key-Value类型状态数据,此类型状态支持添加、更新和获取操作。
  • ValueState:用于单值类型的状态数据,并支持获取和更新状态的方法
  • ReadOnlyBroadcastState:提供只读操作的BroadcastState,仅提供get()、contains()等只读方法。
2.1. UML与所有状态类型介绍

【状态管理一】概览:状态使用、状态分类、状态具体使用_第2张图片

  • BroadcastState:用于存储BroadcastStream中的状态数据,BroadcastState中的数据会被发送到指定算子的所有实例中,并保证每个实例中的数据都相同。
  • AppendingState:支持累积操作的状态数据。写入的数据元素可以存储在类似List的Buffer数据结构中,也可以聚合成单个Value进行存储。
  • MergingState:在AppendingState的基础上增加了合并状态的操作。两个MergingState实例可以合并成一个状态。
  • AggregatingState:用于支持基于AggregateFunction转换的状态数据,通过状态中的AggregateFunction可以对接入的数据进行聚合计算,产生聚合状态结果。
  • ListState:以数组结构类型存储状态数据,用户可通过自定义函数访问和处理状态数据。
  • ReducingState:用于支持ReduceFunction操作状态,给状态添加数据元素后,通过ReduceFunction实现聚合。ReducingState只支持在KeyedStream中获取。

以上就是Flink支持的全部状态类型,不管是用户还是Flink系统内部,都基于这些状态接口实现状态数据的操作,以满足有状态计算的需求。

 

2.2. 内部状态:InternalKvState

InternalKvState接口中定义的方法不对用户开放,在接口上会通过Internal进行标记,专门用于系统内部访问状态数据的辅助操作方法。一方面是为了避免引起混淆,另一方面是因为在各个发行版本中,InternalKvState接口的方法是不稳定的。

在InternalKvState接口中提供了 获取和设定命名空间、获取Raw状态和合并状态的方法,以及获取状态Key和Value等类型序列化器的方法。和状态接口作为所有状态数据的根节点相似,InternalKvState也是所有内部状态的根节点。

【状态管理一】概览:状态使用、状态分类、状态具体使用_第3张图片

不管是基于堆内存还是RocksDB实现的状态存储后端,都同时继承和实现了InternalState接口和具体状态类型的接口。

例如

  • 基于堆内存存储的状态类型有HeapAggregatingState、HeapListState及HeapReducingState等;
  • 基于RocksDB存储的状态类型有RocksDBAggregatingState、RocksDBListState及RocksDBReducingState等。

【状态管理一】概览:状态使用、状态分类、状态具体使用_第4张图片

 

参考:《Flink设计与实现:核心原理与源码解析》

你可能感兴趣的:(flink)