Apache kafka 与状态存储相关的Kstream成本与KTable成本

Apache kafka 与状态存储相关的Kstream成本与KTable成本,apache-kafka,apache-kafka-streams,ksqldb,Apache Kafka,Apache Kafka Streams,Ksqldb,我试图更好地理解如何设置集群以运行Kafka流应用程序。我试图更好地了解将涉及的数据量 在这方面,虽然我可以很快看到KTable需要一个状态存储,但我想知道,从一个主题创建一个Kstream是否意味着立即将该主题的所有日志以仅附加的方式保存到状态存储中。也就是说,特别是如果我们想公开流进行查询 当数据在源主题中移动时,Kafka会自动复制状态存储中的数据吗?如上所述,由于更新,这对于Ktable来说很明显,但对于Kstream,我只想确认发生了什么。无论何时调用任何有状态操作或在对流进行窗口操作

我试图更好地理解如何设置集群以运行Kafka流应用程序。我试图更好地了解将涉及的数据量

在这方面,虽然我可以很快看到KTable需要一个状态存储,但我想知道,从一个主题创建一个Kstream是否意味着立即将该主题的所有日志以仅附加的方式保存到状态存储中。也就是说,特别是如果我们想公开流进行查询


当数据在源主题中移动时,Kafka会自动复制状态存储中的数据吗?如上所述,由于更新,这对于Ktable来说很明显,但对于Kstream,我只想确认发生了什么。

无论何时调用任何有状态操作或在对流进行窗口操作时,都会创建状态存储

您是对的,KTable需要一个状态存储。KTable是changelog流的抽象,其中每个记录表示一个更新。在内部,它使用RocksDB实现,其中所有更新的值都存储在状态存储和变更日志主题中。在任何时候,都可以从changelog主题重建状态存储

虽然KStream有一个不同的概念,但它表示记录流上的抽象,并使用仅附加格式的无界数据集。它在读取源主题时不创建任何状态存储

除非您想查看更新的变更日志,否则可以使用KStream而不是KTable,因为它可以避免创建不需要的状态存储。与kstream相比,ktable总是很昂贵。它还取决于您希望如何使用数据


如果要公开流进行查询,则需要将流具体化为状态存储

无论何时调用任何有状态操作或在对流进行窗口化时,都会创建状态存储

您是对的,KTable需要一个状态存储。KTable是changelog流的抽象,其中每个记录表示一个更新。在内部,它使用RocksDB实现,其中所有更新的值都存储在状态存储和变更日志主题中。在任何时候,都可以从changelog主题重建状态存储

虽然KStream有一个不同的概念,但它表示记录流上的抽象,并使用仅附加格式的无界数据集。它在读取源主题时不创建任何状态存储

除非您想查看更新的变更日志,否则可以使用KStream而不是KTable,因为它可以避免创建不需要的状态存储。与kstream相比,ktable总是很昂贵。它还取决于您希望如何使用数据


如果要公开流进行查询,则需要将流具体化为状态存储

只需补充一点:并非所有的ktable都必须实现。Kafka Streams应用了一些优化,可以避免对状态存储的需要。例如,
builder.table(…).filter(…).toStream().to(…)
将在不具体化任何内容的情况下计算筛选器。只需添加到答案:并非所有的ktable都必须具体化。Kafka Streams应用了一些优化,可以避免对状态存储的需要。例如,
builder.table(…).filter(…).toStream().to(…)
将在不具体化任何内容的情况下计算过滤器。