将知识与实际的应用场景、设计背景关联起来,这是学以致用、刨根问底知识的一种直接方式。
本文介绍
- 状态数据管理,了解InternalKvState接口的设计以及KeyedState和OperatorState在实现上的区别;
- 状态数据初始化的流程,了解有状态计算的底层实现原理。
一. 状态使用概览
flink中状态存在的意义是什么,涉及到哪些场景。
- 实时聚合:比如,计算过去一小时内的平均销售额。这时,你会需要使用到Flink的状态来存储过去一小时内的所有销售数据。
- 窗口操作:Flink SQL支持滚动窗口、滑动窗口、会话窗口等。这些窗口操作都需要Flink的状态来存储在窗口期限内的数据。
- 状态的持久化与任务恢复:实时任务挂掉之后,为了快速从上一个点恢复任务,可以使用savepoint和checkpoint。
- 多流join:Flink至少存储一个流中的数据,以便于在新的记录到来时进行匹配。
二. 状态的数据类型
从数据集与接口实现两个层面介绍状态分类,与状态的全部类型
1. 算子层面
分类
根据DataStream数据集是否基于Key进行分组,可将算子中的状态数据分为KeyedState和OperatorState两种类型。
应用位置
- KeyedState用于经过DataStream.keyby()操作后形成的KeyedStream,并按照Key对状态数据进行分区。