State 概念回顾
我们先回顾一下到底什么是 state,流式计算的数据往往是转瞬即逝,当然,真实业务场景不可能说所有的数据都是进来之后就走掉,没有任何东西留下来,那么留下来的东西其实就是称之为 state,中文可以翻译成状态。
在下面这个图中,我们的所有的原始数据进入用户代码之后再输出到下游,如果中间涉及到 state 的读写,这些状态会存储在本地的 state backend (可以对标成嵌入式本地 kv 存储) 当中。

接下来我们会在四个维度来区分两种不同的 state:operator state 以及 keyed state。
- 是否存在当前处理的 key (current key):operator state 是没有当前 key 的概念,而 keyed state 的数值总是与一个 current key 对应。
- 存储对象是否 on heap:目前 operator state backend 仅有一种 on-heap 的实现;而 keyed state backend 有 on-heap 和 off-heap (RocksDB) 的多种实现。
- 是否需要手动声明快照(snapshot)和恢复(restore)方法:operator state 需要手动实现 snapshot 和 restore 方法;而 keyed state 则由 backend 自行实现,对用户透明。
- 数据大小:一般而言,我们认为 operator state 的数据规模是比较小的;认为 keyed state 规模是相对比较大的。需要注意的是,这是一个经验判断,不是一个绝对的判断区分标准。
StateBackend 的分类
下面这张图对目前广泛使用的三类 state backend 做了区分,其中绿色表示所创建的 operator/keyed state backend 是 on-heap 的,黄色则表示是 off-heap 的。

一般而言,在生产中,我们会在 FsStateBackend 和 RocksDBStateBackend 间选择:
- FsStateBackendÿ

本文深入探讨了Flink State的使用,包括StateBackend的分类,特别是RocksDB StateBackend的配置与优化。文章提供了Operator State和Keyed State的使用心得,强调了长list的慎用、UnionListState的正确操作,以及如何处理RocksDB中的大value值场景。此外,还分享了关于checkpoint间隔和超时时间的设置建议。
最低0.47元/天 解锁文章
568

被折叠的 条评论
为什么被折叠?



