Kafka Streams DSL:将KStream聚合到GlobalKTable

时间:2020-03-17 15:57:34

标签: apache-kafka-streams

我有一个输入流:

KStream<String, X> inputStream = ...

我想对这种方式进行操作(过滤然后聚合),以使我输出到GlobalKTable<String, Y>中,然后可以使用以下内容回读:

KeyValueIterator<String, Y> = streams.store("y-global-store", QueryableStoreTypes.keyValueStore()).all()

Streams DSL可以支持吗?如果输出表是KTable,这似乎是可能的,但是鉴于我在该存储区中拥有的少量数据,我想使用GlobalKTable


这是我的处理器,它将KStream<String, X>转换为KTable<String, Y>

KTable<String, Y> outputTable = inputStream
    .filter(...)
    .groupByKey(Grouped.with(Serdes.String(), ySerde))
    .aggregate(
        initializeWithNull(),
        aggregateXToAY(),
        Materialized.`as`<String, Y, KeyValueStore<Bytes, ByteArray>>("y-global-store")
            .withKeySerde(stringSerde)
            .withValueSerde(tagRecordSerde)
    )

但是这不能创建GlobalKTable,我想念什么?

1 个答案:

答案 0 :(得分:4)

Stream DSL不支持从KStream构建GlobalKTable。看来,创建GlobalKTable的唯一方法是使用StreamsBuilder. globalTable("input_topic_for_globalktable")

我认为DSL不支持以这种方式创建GlobalKtable的原因是每个应用程序实例都包含整个GlobalKTable状态,因此默认情况下它被禁用了日志记录(它不会将changelog记录到changelog主题中),因此它使用输入主题直接用于恢复状态过程(容错),此主题必须启用日志压缩。

一种解决方案是,您必须为此输入主题准备数据,然后才能作为outputTable KTable的输出:

outputTable.toStream().to("input_topic_for_globalktable");

或直接使用outputTable KTable的changelog主题(我认为此解决方案更好,因为您不需要新主题的额外磁盘空间),其名称为:

<your-application_id>-y-global-store-changelog