应用程序数据快照需要mapstate的高性能

qvtsj1bj  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(266)

因为我们有一个流应用程序来做交易清算,我们需要缓存内存和检查点中的所有帐户,以定期快照,以避免数据丢失。
缓存需要与快照同步,并提供密集的读/写操作。
我们尝试了以下代码,发现性能不太好。

MapState<KEY, VALUE> orderState = runtimeContext.getMapState(new 
MapStateDescriptor(name, TypeInformation.of(keyType), TypeInformation.of(valueType)));

MapStateStorage<KEY, VALUE> mapStateStorage = new MapStateStorage<>(orderState);

我们将业务对象缓存在自己的Map中,在提交阶段,我们获取修改后的业务对象并将其放入mapstatestorage
与配置

rocksdb.filepath=s3://test-flink/${ENV_NAME}/rocksdb

从rocksdbmapstate的代码中,put将转到rocksdb,write也将转到rocksdb,并对序列化和反序列化进行惩罚。
对于这样的高r/w率,有什么最佳实践吗?
谢谢,

mfuanj7w

mfuanj7w1#

我很想知道你为什么选择rocksdb状态后端,因为听起来好像所有东西都适合内存,而且你使用flink状态只是为了容错。如果是这样的话,您是否研究过使用fsstatebackend?它有更好的吞吐量和平均延迟(尽管最坏情况下的延迟受gc需求的影响)。这将避免serde开销,而且由于所有内容都只是堆上的对象,因此您还可以探索不必处理缓存,从而避免当前正在执行的复制。
将来您可能还需要考虑可溢出堆键控状态后端。

相关问题