物化状态存储目录中缺少数据

问题描述 投票:0回答:1

我的应用程序在 GroupedKTable 上进行聚合,然后将其具体化为 PersistentKeyValueStore

我将 state.dir 配置为永久路径(不是默认的 /tmp/kstreams

我可以看到作为事件存储在更改日志主题中的键值,并且我的应用程序成功从状态存储中获取它们。

但是当我检查 state.dir 目录时,我只发现那里有元数据。没有数据(.sst 文件,特别是)(即使我指定了持久存储)

为什么会这样?我在哪里可以找到数据?在我看来,这是 InMemoryStore 的一种行为

具体化后的样子:

val StoreSupplier = Stores.persistentTimestampedKeyValueStore(name)
Materialized.as(StoreSupplier)(KeySerde, ValueSerde)

然后我将其传递给聚合。

注意:在本地计算机上,使用 TopologyTestDriver,我可以看到 .sst 文件。我的问题适用于应用程序的实际部署

apache-kafka apache-kafka-streams
1个回答
0
投票

这实际上是 RocksDB 的细节。

当 kafka-streams 将数据刷新到 RocksDB 时(当 commit.interval.ms 已过,或者缓存已满)时,RocksDB 将数据存储在 active memtable 中,以及事务日志中(在 kafka 中) -streams 配置为变更日志主题)。

只有当memtable已满时,在kafka-streams中配置为16MB,memtable才变为只读,此时可以写入.sst文件

只要store的大小小于memtable大小,就看不到state.dir中的.sst

文件

我发现以下文章对于了解 RocksDB 详细信息很有趣:https://www.confluence.io/blog/how-to-tune-rocksdb-kafka-streams-state-stores-performance/

© www.soinside.com 2019 - 2024. All rights reserved.