知识卡片

Keyed State与Operator State的本质区别

专业/工作 · 501.b

内容

托管状态分两种:Keyed State是与某个具体Key绑定的状态,只能在按Key分组后的数据流上使用,每个Key各自维护一份独立的状态值,适合”统计每个用户/每个设备各自的累计值”这类场景;Operator State是与算子的某个并行实例本身绑定的状态,不区分Key,一般用在自定义Source/Sink这类不方便按Key切分的场景。可以把Keyed State理解为Operator State按Key进一步细分后的特例。为了支持集群扩缩容时重新分配状态,Flink把同一个算子实例上的所有Keyed State打包进一个”Key Group”容器,Key Group才是状态在节点间重新分布时的最小搬迁单元,而不是单个Key,这样避免了扩容时要为每个Key单独计算迁移路径的开销。这些状态最终落到哪种存储介质上,取决于[[Flink三种状态后端的取舍]]。

参考来源

《Flink入门与实战》第4章《状态管理及容错机制》