Apache Flink:状态反序列化的频率如何?

Rez*_*'ei 5 apache-flink flink-streaming

Flink de/serialise operator state 的频率如何?每个获取/更新还是基于检查点?状态后端是否有所作为?

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

Fab*_*ske 7

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

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

相比之下,RocksDBStateBackend将所有状态作为字节数组存储在嵌入式 RocksDB 实例中。因此,它为每次读/写访问对密钥的状态进行反/序列化。您可以控制通过选择适当的原始状态,即状态“多少”连载ValueStateListStateMapState,等。

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

RocksDBStateBackend通过他们的文件复制到一个持久的文件系统检查点的状态。因此,在执行检查点时不涉及额外的序列化。