Flink状态管理
1.状态概述
1.1什么是状态?
无状态计算指的是数据进入Flink后经过算子时只需要对当前数据进行处理就能得到想要的结果,有状态计算就是需要和历史的一些状态或进行相关操作,才能计算出正确的结果
状态的使用场景:
- 去重,需要记录哪些数据出现过,哪些没出现过
- 窗口计算,比如计算一个小时的counter
- 机器学习,训练模型
- 访问历史数据,需要与昨天的数据进行对比,历史数据放在状态里
1.2为什么要管理状态?
流式作业的特点是7*24小时运行,数据不重复消费,不丢失,保证只计算一次,数据实时产出不延迟,但是当状态很大,内存容量限制,或者实例运行奔溃,或需要扩展并发度等情况下,如何保证状态正确的管理,在任务重新执行的时候能正确执行,状态管理就显得尤为重要。
1.3理想的状态管理
理想的状态管理是:
- 易用,flink提供了丰富的数据结构,简洁易用的接口
- 高效,flink对状态的处理读写快,可以横向扩展,保存状态不影响计算性能
- 可靠,flink对状态可以做持久化,而且可以保证exactly-once语义
2.状态类型与使用示例
Flink中有两种基本的State: Keyed State 和 Managed State
2.1 Keyed State & Operator State
keyed state | operator state | |
---|---|---|
适用场景 | 只能应用在KeyedSteam上 | 可以用于所有的算子 |
state处理方式 | 每个key 对应一个 state,一个operator处理多个key ,会访问相应的多个state | 一个operator对应一个state |
并发改变 | 并发改变时,state随着key在实例间迁移 | 并发改变时需要你选择分 |