Kafka Stream:KTable物化

Kafka Stream: KTable materialization

如何确定主题的 KTable 具体化何时完成?

例如假设 KTable 有几百万行。伪代码如下:

KTable<String, String> kt = kgroupedStream.groupByKey(..).reduce(..); //Assume this produces few million rows

在某个时间点,我想安排一个线程来调用以下内容,写入主题: kt.toStream().to("output_topic_name");

我想确保所有数据都作为上述调用的一部分写入。此外,一旦调用了上述 "to" 方法,是否可以在下一个计划中调用它,或者第一个调用将始终保持活动状态?

后续问题:

约束条件
1) 好的,一旦启动 kafkastream,我看到 kstream 和 ktable 是 unbounded/infinite。但是,ktable 实体化(到压缩主题)不会在指定时间段内为同一键发送多个条目。

因此,除非压缩过程尝试清除这些并仅保留最新的,否则下游应用程序将消耗所有可用条目以从主题查询相同的键,从而导致重复。即使压缩过程进行了某种程度的清理,也总是不可能在给定的时间点,随着压缩过程的进行,有些键具有多个条目。

我假设 KTable 在 RocksDB 中只有一个给定键的记录。如果我们有办法安排物化,那将有助于避免重复。此外,减少主题中持久化的数据量(增加存储),增加网络流量,清理压缩过程的额外开销。

2) 也许 ReadOnlyKeyValueStore 允许从存储中进行受控检索,但它仍然缺乏安排检索键、值和写入主题的方法,这需要额外的编码。

能否改进 API 以允许受控实体化?

KTable 实体化永远不会完成,您也不能 "invoke" to()

当您使用流 API 时,您 "plug together" 运算符的 DAG。实际的方法调用,不触发任何计算,只是修改operators的DAG

只有在您通过 KafkaStreams#start() 开始计算后才会处理数据。请注意,您指定的所有运算符将在计算开始后连续并发 运行。

没有"end of a computation",因为输入应该是unbounded/infinite,因为上游应用程序可以随时将新数据写入输入主题。因此,您的程序永远不会自行终止。如果需要,您可以通过 KafkaStreams#close() 停止计算。

在执行过程中,您不能更改DAG。如果你想改变它,你需要停止计算并创建一个新的KafkaStreams实例,将修改后的DAG作为输入

跟进:

是的。您必须将 KTable 视为 "versioned table",它会在条目更新时随时间演变。因此,所有更新都写入更改日志主题并作为更改记录发送到下游(请注意,KTables 也会进行一些缓存,以 "de-duplicate" 对同一键的连续更新:参见 https://docs.confluent.io/current/streams/developer-guide/memory-mgmt.html)。

will consume all available entries for the same key querying from the topic, causing duplicates.

我不会将它们视为 "duplicates",而是 更新。是的,应用程序需要能够正确处理这些更新。

if we have a way to schedule the materialization, that will help to avoid the duplicates.

具体化是一个连续的过程,每当输入主题中有新的输入记录可用并被处理时,KTable 就会更新。因此,在任何时间点都可能有特定密钥的更新。因此,即使您完全控制何时向下游的更新日志主题 and/or 发送更新,稍后也可能会有新的更新。这就是流处理的本质。

Also, reduce the amount of data being persisted in topic (increasing the storage), increase in the network traffic, additional overhead to the compaction process to clean it up.

上面说了缓存是为了节省资源

Can the API be improved to allow a controlled materialization?

如果提供的 KTable 语义不符合您的要求,您可以随时将自定义运算符编写为 ProcessorTransformer,将键值存储附加到它,并实现任何你需要。