为了更好地理解如何设置群集以运行我的Kafka-Stream应用程序,我试图对将要涉及的数据量有更好的了解。
在这方面,虽然我很快就能看到KTable需要状态存储,但是我想知道是否从主题创建Kstream时,立即意味着将该主题的所有日志显然以仅附加方式复制到状态存储中,假设。也就是说,特别是如果我们要公开流以进行查询?
当Kafka是Kstream时,当它们在源主题中移动时,Kafka是否会自动复制状态存储中的数据?如上所述,由于更新,这对于Ktable来说似乎是显而易见的,但是对于Kstream,我只想确认发生了什么?
答案 0 :(得分:4)
每当调用任何有状态操作时或在窗口流打开窗口时,都会创建状态存储。
您是正确的,KTable需要状态存储。 KTable是变更日志流的抽象,其中每个记录代表一个更新。在内部使用RocksDB实现,其中所有更新的值都存储在状态存储区和changelog主题中。随时都可以从changelog主题重建状态存储。
尽管KStream具有不同的概念,但它表示无记录数据集的纯附加格式记录流上的抽象。在阅读源主题时,它不会创建任何状态存储。
除非您想查看更新的变更日志,否则可以使用KStream代替KTable,因为这样可以避免创建不需要的状态存储。与KStreams相比,KTable总是很昂贵。此外,这取决于您要如何使用数据。
如果要公开流以进行查询,则需要将流具体化到状态存储中。