(1)什么状态
在流式计算中有些操作一次处理一个独立的事件(比如解析一个事件), 有些操作却需 要记住多个事件的信息(比如窗口操作)。
那些需要记住多个事件信息的操作就是 有状态 的。
流式计算分为 无状态计算和有状态计算两种情况
无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应 用程序从传感器接收水位数据,并在水位超过指定高度时发出警告。
有状态的计算则会基于多个事件输出结果。以下是一些例子。例如,计算过去一小
时的平均水位,就是有状态的计算。所有用于复杂事件处理的状态机。例如,若在 一分钟内收到两个相差 20cm以上的水位差读数,则发出警告,这是有状态的计算。 流与流之间的所有关联操作,以及流与静态表或动态表之间的关联操作,都是有状 态的计算。
传统的流处理架构:
有状态的流处理架构:
(2)为什么需要状态管理
下面的几个场景都需要使用流处理的状态功能:
去重: 数据流中的数据有重复,我们想对重复数据去重,需要记录哪些数据已经流入过应 用,当新数据流入时,根据已流入过的数据来判断去重。
检测: 检查输入流是否符合某个特定的模式,需要将之前流入的元素以状态的形式缓存下 来。比如,判断一个温度传感器数据流中的温度是否在持续上升。
聚合: 对一个时间窗口内的数据进行聚合分析,分析一个小时内水位的情况。
更新机器学习模型: 在线机器学习场景下,需要根据新流入数据不断更新机器学习的模型参数。
(3)Flink中状态的分类
Flink 包括两种基本类型的状态 Managed State 和 Raw State
注意:
从具体使用场景来说,绝大多数的算子都可以通过继承 Rich 函数类或其他 提供好的接口类,在里面使用 Managed State。Raw State 一般是在已有算子和 Managed State 不够用时,用户自定义算子时使用。
在我们平时的使用中 Managed State 已经足够我们使用, 下面重点学习 Managed State
(4)Managed State 的分类
对 Managed State 继续细分,它又有两种类型
Keyed State(键控状态)
Operator State(算子状态)