flink系列(10)-状态State和状态描述StateDescriptor

本文深入探讨了Apache Flink中的状态管理机制,包括InternalKVState的内部接口与面向用户的State接口,详细解析了ValueState、ListState、ReducingState、FoldingState和MapState的功能与使用方法,并介绍了StateDescriptor在状态定义中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. state的整个继承图如下

527168b8ff12aca0021536ad8a292e9b96e.jpg

2.

InternalKVState 提供了只对 Flink 引擎暴露的接口比如 namespace set/get、val get、namespace merging,这些接口并不稳定,Flink 引擎希望对上层应用屏蔽,而通过 State 接口暴露出来的方法普通用户是可以使用的。

用户拿到 InternalKVState 的具体实现 HeapXXXState/RocksDBXXXState 后,便可以对背后的存储进行状态读写

2.1内部状态接口

d2c3a4e07834fd74d715b595574a17af8fb.jpg

2.2面向用户的接口

3249d4332af195e9af2c94bed2955c7856d.jpg

 

  • ValueState:即类型为T的单值状态。这个状态与对应的key绑定,是最简单的状态了。它可以通过update方法更新状态值,通过value()方法获取状态值。
  • ListState:即key上的状态值为一个列表。可以通过add方法往列表中附加值;也可以通过get()方法返回一个Iterable<T>来遍历状态值。
  • ReducingState:这种状态通过用户传入的reduceFunction,每次调用add方法添加值的时候,会调用reduceFunction,最后合并到一个单一的状态值。
  • FoldingState:跟ReducingState有点类似,不过它的状态值类型可以与add方法中传入的元素类型不同(这种状态将会在Flink未来版本中被删除)。
  • MapState:即状态值为一个map。用户通过putputAll方法添加元素

4.StateDescriptor

7e76667cc7c856c3979d0f3a00d7ad41f7c.jpg

State 既然是暴露给用户的,那么就需要有一些属性需要指定:state 名称、val serializer、state type info。在对应的statebackend中,会去调用对应的create方法获取到stateDescriptor中的值。Flink通过StateDescriptor来定义一个状态。这是一个抽象类,内部定义了状态名称、类型、序列化器等基础信息。与上面的状态对应,从StateDescriptor派生了ValueStateDescriptorListStateDescriptor等descriptor

  • ValueState getState(ValueStateDescriptor)
  • ReducingState getReducingState(ReducingStateDescriptor)
  • ListState getListState(ListStateDescriptor)
  • FoldingState getFoldingState(FoldingStateDescriptor)
  • MapState getMapState(MapStateDescriptor)

最后来一张较为全面的图

351b0f05e8a2787b2204b936b15754d463d.jpg

转载于:https://my.oschina.net/u/1262062/blog/3049628

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值