首页 文章

Apache Flink:状态de /序列化的频率是多少?

提问于
浏览
2

Flink de / serialise运营商的频率是多少?每次获取/更新或基于检查点?州后端会有所作为吗?

我怀疑,对于每个密钥具有不同密钥(数百万)和每秒数千个事件的密钥流,de /序列化可能是一个大问题 . 我对吗?

1 回答

  • 2

    你的假设是正确的 . 这取决于州后端 .

    在JVM堆上存储状态的后端( MemoryStateBackendFSStateBackend )不会为常规读/写访问序列化状态,而是将其作为堆上的对象保留 . 虽然这会导致非常快速的访问,但您显然必然会遇到JVM堆的大小,并且可能还会遇到垃圾回收问题 . 采用检查点时,对象将被序列化并保留,以便在发生故障时进行恢复 .

    相比之下, RocksDBStateBackend 将所有状态存储为嵌入的RocksDB实例中的字节数组 . 因此,它为每次读/写访问取消/序列化密钥的状态 . 您可以通过选择适当的状态原语(即 ValueStateListStateMapState 等)来控制"how much"状态被序列化 .

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

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

相关问题