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 中删除记录(==释放内存)
很难估计。对于一般大小,请考虑本指南: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-值记录,所谓的墓碑。这些被视为删除。