gpt4 book ai didi

java - Kafka Streams KeyValueStore 保留.字节

转载 作者:行者123 更新时间:2023-12-01 23:55:21 26 4
gpt4 key购买 nike

我对 KeyValueStore 有一个有趣的行为,我有一些假设来解释它,也许你可以看出我是对还是错......

我配置了一个如下所示的状态存储

Map<String, String> storeConfig = new HashMap<>();
storeConfig.put(TopicConfig.RETENTION_MS_CONFIG, TimeUnit.DAYS.toMillis(30));
storeConfig.put(TopicConfig.CLEANUP_POLICY_CONFIG, "compact,delete");

StoreBuilder store1 = Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore("STORE1"),
Serdes.String(),
Serdes.String()
);

streamsBuilder.addStateStore(store1.withLoggingEnabled(storeConfig));

使用此配置,我预计超过 30 天的数据集将会消失,但我观察到的情况完全不同。

当我查看商店的 rockdb 目录时,每 14451 字节就会滚动一次文件,并且目录中有这样的结构

14451  1. Oct 19:00 LOG
14181 30. Sep 15:59 LOG.old.1569854012833395
14451 30. Sep 17:40 LOG.old.1569918431235734
14451 1. Oct 11:05 LOG.old.1569949239434224

似乎不是实现配置的保留时间超过 30 天,而是实现了文件大小。

我在网上发现还有一个参数Topic.RETENTION_BYTES_CONFIG 'retention.bytes',我是不是也得配置这个参数,这样我的Data在保留期间是可见的,不会因为文件大小而被删除(我知道我的 key 有值(value),但在这种现象发生后我无法访问它)...

感谢您的回答..

最佳答案

在内部,KeyValueStores 使用 RocksDB,RocksDB 在内部使用所谓的 LSM-Tree(Log-Structured-Merged-Tree),它创建许多较小的段,然后将这些段组合成更大的段。在这个“压缩”步骤之后,较小的段文件可以被删除,因为数据被复制到较大的段文件中。因此,没有什么可担心的。

此外,Topic.RETENTION_MS_CONFIG 是一个主题配置,与 Kafka Streams 应用程序的本地存储无关。此外,KeyValueStore 将永远保留数据,直到通过“逻辑删除”消息显式删除为止。因此,如果您为基础变更日志主题设置保留时间,则数据可能会在主题中删除,但不会在本地存储中删除。

如果您想对本地存储应用保留时间,则不能使用 KevValueStore,但可以使用支持保留时间的 WindowedStore

关于java - Kafka Streams KeyValueStore 保留.字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58203974/

26 4 0