Apache Flink:状态多久一次反序列化?

时间:2018-07-25 12:23:55

标签: apache-flink flink-streaming

Flink多久一次取消/序列化操作员状态?每个获取/更新还是基于检查点?国家后端会有所作为吗?

我怀疑,在具有不同密钥(百万)和每个密钥每秒数千个事件的密钥流的情况下,反序列化可能是一个大问题。我说的对吗?

1 个答案:

答案 0 :(得分:3)

您的假设是正确的。这取决于状态后端。

在JVM堆上存储状态的后端(MemoryStateBackendFSStateBackend)不会为常规的读/写访问序列化状态,而是将其保留为堆上的对象。尽管这可以导致非常快速的访问,但是您显然受限于JVM堆的大小,并且还可能面临垃圾回收问题。采取检查点时,对象将被序列化并保留,以在出现故障时进行恢复。

相反,RocksDBStateBackend将所有状态存储为嵌入式RocksDB实例中的字节数组。因此,它为每个读/写访问取消/序列化密钥的状态。您可以通过选择适当的状态原语来控制“多少”状态的序列化,即ValueStateListStateMapState等。

例如,ValueState始终作为一个整体进行反序列化,而MapState.get(key)仅对密钥进行序列化(用于查找),并对序列化的返回值进行反序列化。因此,您应该使用MapState<String, String>而不是ValueState<HashMap<String, String>>。类似的考虑也适用于其他状态原语。

RocksDBStateBackend通过将其文件复制到持久文件系统来检查其状态。因此,在采用检查点时不会涉及其他序列化。

相关问题