Flink多久一次取消/序列化操作员状态?每个获取/更新还是基于检查点?国家后端会有所作为吗?
我怀疑,在具有不同密钥(百万)和每个密钥每秒数千个事件的密钥流的情况下,反序列化可能是一个大问题。我说的对吗?
答案 0 :(得分:3)
您的假设是正确的。这取决于状态后端。
在JVM堆上存储状态的后端(MemoryStateBackend
和FSStateBackend
)不会为常规的读/写访问序列化状态,而是将其保留为堆上的对象。尽管这可以导致非常快速的访问,但是您显然受限于JVM堆的大小,并且还可能面临垃圾回收问题。采取检查点时,对象将被序列化并保留,以在出现故障时进行恢复。
相反,RocksDBStateBackend
将所有状态存储为嵌入式RocksDB实例中的字节数组。因此,它为每个读/写访问取消/序列化密钥的状态。您可以通过选择适当的状态原语来控制“多少”状态的序列化,即ValueState
,ListState
,MapState
等。
例如,ValueState
始终作为一个整体进行反序列化,而MapState.get(key)
仅对密钥进行序列化(用于查找),并对序列化的返回值进行反序列化。因此,您应该使用MapState<String, String>
而不是ValueState<HashMap<String, String>>
。类似的考虑也适用于其他状态原语。
RocksDBStateBackend
通过将其文件复制到持久文件系统来检查其状态。因此,在采用检查点时不会涉及其他序列化。