Flink Keyed State ,Operator State 作用 区别 用法

Flink的State类型


基本类型划分:
在Flink中,按照基本类型,对State做了以下两类的划分:

Keyed State,和Key有关的状态类型,它只能被基于KeyedStream之上的操作,方法所使用。我们可以从逻辑上理解这种状态是一个并行度操作实例和一种Key的对应, <parallel-operator-instance, key>。
Operator State(或者non-keyed state),它是和Key无关的一种状态类型。相应地我们从逻辑上去理解这个概念,它相当于一个并行度实例,对应一份状态数据。因为这里没有涉及Key的概念,所以在并行度(扩/缩容)发生变化的时候,这里会有状态数据的重分布的处理。


组织形式划分:
但是在这里还有一种按照组织形式的划分,也可以理解为按照runtime层面的划分,又可以分为一下两类:

Managed State,这类State的内部结构完全由Flink runtime内部来控制,包括如何将它们编码写入到checkpoint中等等。
Raw State,这类State就比较显得灵活一些,它们被保留在操作运行实例内部的数据结构中。从Flink系统角度来观察,在checkpoint时,它只知道的是这些状态数据是以连续字节的形式被写入checkpoint中。等待进行状态恢复时,又从字节数据反序列化为状态对象。


Managed State可以在所有的data stream相关方法中被使用,官方也是推荐优先使用这类State,因为它能被Flink runtime内部做自动重分布而且能被更好地进行内存管理。

 

为什么需要State?作用是什么?

1 保存中间结果,实现某些功能 

2 方便保存到检查点中,便于从检查点恢复

 

Keyed State  与 Operator State 区别

一个算子的并行度是多少,就有多少个子任务。如果不同的key比较多,该算子的并行度低,那么一个子任务会处理多个key流。

Keyed State  与key相关,Operator State 与key无关。

实现Operator State,需要手动实现CheckpointedFunction或ListCheckpointed 接口 

Managed Keyed State包含:

ValueState<T>
ListState<T>
ReducingState<T>
AggregatingState<IN, OUT>
FoldingState<T, ACC>
MapState<UK, UV>

 

Managed Operator State包含:

ListState

UnionListState

BroadcastState
 

 

Managed State 与 Raw State区别

Flink有两种基本类型的状态:托管状态(Managed State)和原生状态(Raw State)。从名称中也能读出两者的区别:Managed State是由Flink管理的,Flink帮忙存储、恢复和优化,Raw State是开发者自己管理的,需要自己序列化。

 

两者的具体区别有:

  • 从状态管理的方式上来说,Managed State由Flink Runtime托管,状态是自动存储、自动恢复的,Flink在存储管理和持久化上做了一些优化。当我们横向伸缩,或者说我们修改Flink应用的并行度时,状态也能自动重新分布到多个并行实例上。Raw State是用户自定义的状态。
  • 从状态的数据结构上来说,Managed State支持了一系列常见的数据结构,如ValueState、ListState、MapState等。Raw State只支持字节,任何上层数据结构需要序列化为字节数组。使用时,需要用户自己序列化,以非常底层的字节数组形式存储,Flink并不知道存储的是什么样的数据结构。
  • 从具体使用场景来说,绝大多数的算子都可以通过继承Rich函数类或其他提供好的接口类,在里面使用Managed State。Raw State是在已有算子和Managed State不够用时,用户自定义算子时使用。

 

Keyed State 用法:

Flink Keyed State 实例

 

Operator State用法:

Flink Operator State 实例 实现ListCheckpointed

Flink Operator State 实例 实现CheckpointedFunction

CheckpointedFunction 可对多种类型的状态进行保存、恢复、初始化;当并行度变化时,支持按照Even-split Redistribution重分布策略(默认)和Union redistribution重分布策略;

ListCheckpointed 只能对List类型的状态进行保存、恢复;当并行度变化时,只支持按照Even-split Redistribution重分布策略。

 Even-split redistribution:每个算子返回一个状态数据的list集合。 当从 checkpoint 中恢复状态数据或者进行重新分配的时候,List 类型的状态数据将被均匀切割成和并行示例数量一致的子链表(每个子链表的元素个数一致),每个算子获得一个子链表,子链表可能为空,也可能包含一个或多个数据。例如,当一个并行度为1 算子,拥有一个 ListState,其中包含数据 e1、e2,当算子的并行改成 2 的时候,发生重新分配,ListState 被切分成两个子链,算子的并行实例1 获得包含 e1 的ListState, 并行实例2 获得包含 e2 的ListState。

Union redistribution:每个算子返回一个状态数据的 List 集合,包含所有的状态数据。当发生重新分配或者从 checkpoint 中恢复状态数据的时候,每个算子都将获取到全部的状态数据。

 

参考:

https://cloud.tencent.com/developer/article/1584935

https://blog.csdn.net/Androidlushangderen/article/details/86485850

https://summerbuger.github.io/2019/01/26/%E6%8A%80%E6%9C%AF/flink/flink%E4%B9%8Bstate/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章