无状态 案例
wordcount 中的以下操作:
- 根据空格拆分字符串
- 将上面的字符串放入到
Tuple中,格式:(字符串,1)
理解
类似这种 map/flatMap/filter 操作,来一个数据,就处理这个数据,不考虑历史数据,就是 无状态
提示:像这种无状态的,一般不需要做额外操作
有状态 案例
wordcount 中的以下操作:当出现相同的字符串,数量 就加1
理解
类似这种 sum、reduce 聚合 操作:
- 接收一个数据
- 任务处理时,获取状态,将当前数据 与 状态 中的 数据 做计算
- 将计算后的结果,更新到 状态 中
- 发出结果给下游算子
状态
由一个任务维护,并且用来 计算某个结果的所有数据,都属于这个任务的 状态
可以认为 状态 类似 成员变量,可以被访问修改
通过 上面有状态案例(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

