随着时间的推移,KTable/KStream 内存消耗

Joh*_*ack 5 memory apache-kafka apache-kafka-streams confluent-platform

有没有办法计算随着时间的推移,java/scala 应用程序中的 KTable/KStream 将使用多少堆(或任何其他)内存?

我有一些具体的假设,我想知道它们是否正确:

  • Kafka 流仅使用内部主题和 RocksDB。

  • RocksDB 是嵌入式数据库,因此它使用我的应用程序的堆内存。

  • 当拓扑中的任何处理器不再使用这些记录时,KStream 不断地从 RocksDB 中删除所有记录(例如,用于与指定的 JoinWindow 进行连接)(== 没有使用太多内存)

  • KTable完全存储在RocksDB中(==在内存中)

  • 当 KTable 收到空值记录时,它会从 RocksDB 中删除记录(==释放内存)

Mat*_*Sax 4

很难估计。对于一般大小,请考虑本指南:https://docs.confluence.io/current/streams/sizing.html

Kafka 流仅使用内部主题和 RocksDB。

是的。您还可以用内存存储(属于 Kafka Streams 的一部分)替换 RocksDB 或实现您自己的自定义存储。

RocksDB 是嵌入式数据库,因此它使用我的应用程序的堆内存。

RocksDB 使用堆外内存,也会溢出到磁盘。

当拓扑中的任何处理器不再使用这些记录时,KStream 不断地从 RocksDB 中删除所有记录(例如,用于与指定的 JoinWindow 进行连接)(== 没有使用太多内存)

这取决于商店类型。对于键值存储(即“常规” KTable),数据不会被删除(显式删除消息除外,即所谓的逻辑删除)。对于时间窗口/会话窗口 KTable(窗口聚合的结果)和联接,存在一个保留期,之后数据将被删除。

KTable完全存储在RocksDB中(==在内存中)

RocksDB 也会造成磁盘溢出。它不仅仅存在于内存中。

当 KTable 收到空键记录时,它会从 RocksDB 中删除记录(==释放内存)

null- 密钥记录没有格式错误。我假设你的意思是null-值记录,所谓的墓碑。这些被视为删除。