State 种类
Operator 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 规模是
相对比较大的。需要注意的是,这是一个经验判断,不是一个绝对的判断区分标准。
State 的内部存储
KeyedState动态缩放
- Flink中的key是按照
hash(key) % parallelism
的规则分配到各个Sub-Task上去 - 如何决定一个key该分配到哪个Key Group中
- 对key进行两重哈希(一次取hashCode,一次做MurmurHash)之后,再对最大并行度取余,得到Key Group的索引
- 如何决定一个Sub-Task该处理哪些Key Group(即对应的KeyGroupRange)
- 由并行度、最大并行度和算子实例(即Sub-Task)的ID共同决定
State Backend 选择
RocksDB
RocksDB 的 State存储
StateTtlConfig
优化
RocksDB 优化相关参数
相关PDF
State best practice.pdf