flink1.12.x State状态-无状态、有状态

无状态 案例

wordcount 中的以下操作:

  1. 根据空格拆分字符串
  2. 将上面的字符串放入到 Tuple 中,格式:(字符串,1)

理解

类似这种 map/flatMap/filter 操作,来一个数据,就处理这个数据,不考虑历史数据,就是 无状态

提示:像这种无状态的,一般不需要做额外操作

有状态 案例

wordcount 中的以下操作:当出现相同的字符串,数量 就加1

理解

类似这种 sum、reduce 聚合 操作:

  1. 接收一个数据
  2. 任务处理时,获取状态,将当前数据 与 状态 中的 数据 做计算
  3. 将计算后的结果,更新到 状态 中
  4. 发出结果给下游算子

状态

由一个任务维护,并且用来 计算某个结果的所有数据,都属于这个任务的 状态

  • 可以认为 状态 类似 成员变量,可以被访问修改

  • 通过 上面有状态案例(sum、reduce),可知 flink 可 自动进行状态管理

为什么使用状态

成员变量 可以替代 状态吗?不行

flink程序是 并发运行 的,如上图,Task1 表示某个算子,其并发度是 2,所以有 2个 task1

它们不在一个slot上,甚至不在一个TaskManager上,所以这 2个 task1 只能访问各自的状态

参考:
https://zhuanlan.zhihu.com/p/138075463
https://blog.csdn.net/yunweijie_cn/article/details/123421456


原文出处:/show_1IX21iJsrmT2.html