我有一个输入流:
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
,我想念什么?
答案 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