我的应用程序在 GroupedKTable 上进行聚合,然后将其具体化为 PersistentKeyValueStore
我将 state.dir 配置为永久路径(不是默认的 /tmp/kstreams)
我可以看到作为事件存储在更改日志主题中的键值,并且我的应用程序成功从状态存储中获取它们。
但是当我检查 state.dir 目录时,我只发现那里有元数据。没有数据(.sst 文件,特别是)(即使我指定了持久存储)
为什么会这样?我在哪里可以找到数据?在我看来,这是 InMemoryStore 的一种行为
具体化后的样子:
val StoreSupplier = Stores.persistentTimestampedKeyValueStore(name)
Materialized.as(StoreSupplier)(KeySerde, ValueSerde)
然后我将其传递给聚合。
注意:在本地计算机上,使用 TopologyTestDriver,我可以看到 .sst 文件。我的问题适用于应用程序的实际部署
这实际上是 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/