flink的状态:即flink算子任务的状态,所谓状态其实是flink程序维护的一些变量,用来存放算子任务的中间结果,有多种类型的状态用来存放不同数据结构的中间结果。当用户需要保存中间结果时,可以定义相应的状态来保存,由此可见状态的两个作用,一是保存程序的中间结果,二是状态可以持久化,用于程序挂掉时恢复计算,无需从头计算。
状态的分类
状态可分为keyedState 和operator State,他们的区别是状态变量的作用范围不同。
算子调用keyBy process算子之后,可以定义keyedState,只保存当前key对应的数据。
operator State 的作用范围是当前算子的子任务,和定义成员变量的作用范围一样。
keyed State包括以下几种:
Value State:可以保存一个具体类型的值
Map State:可以方便的保存kv类型的数据
List State:保存一个List到状态中
Reducing State :保存时进行归约聚合运算后再保存
Aggregation State :保存时进行聚合运算后再保存
一种特殊的状态:广播状态(broadcast State)
广播流才可以使用,全局所有子任务共用一个状态,一般用于将一些配置信息进行广播,其它流可以从广播状态中获取数据。
状态后端:
那么状态的存储,访问和维护都是怎么做到的呢,flink提供了一种可插拔的组件来实现,叫做状态后端,主要负责管理本地状态的存储方式。
flink提供来两种状态后端,默认的是hashmapStateBackend,它会把状态数据封装为对象存在taskmanager的对内存中,以键值对的形式。
另一种是EmbeddedRocksDBStateBackend,可以将状态数据持久化到taskmanager本地磁盘。访问性能会差一些,适合海量状态数据场景使用。