Kafka Streams Aggregator中的访问记录偏移

时间:2020-04-30 20:23:40

标签: apache-kafka-streams

我有一个简单的窗口拓扑:

builder.stream("input-topic", Consumed.with(...))
    .groupByKey()
    .windowedBy(TimeWindows.of(windowSize).advanceBy(windowAdvance).grace(windowGrace))
    .aggregate(Frame::new,
            this::windowAggregator,
            ...
    )
    .transformValues(FrameTransformer::new)
    .toStream()
    .selectKey((key, value) -> value...)
    .to("output-topic", Produced.with(...));

我想将窗口开始处的实际记录偏移量放入Frame聚合对象中。

如何从windowAggregatoraggregate()处理函数)函数访问记录偏移量?

我知道我可以访问FrameTransformer中的记录偏移量,但这无助于我创建准确的Frame对象,这些对象以开始和结束偏移量来描述我的窗口。

我听说有一种方法可以通过在.transform()之前插入另一个groupByKey()调用来实现偏移量,但是我需要修改事件的模式记录以在其中存储偏移信息。

有没有一种(更简单的)方法来实现我的意图?

更新

实际上,我可以通过以下方式在Frame对象中获得准确的窗口开始和结束偏移量

builder.stream("input-topic", Consumed.with(...))
    .transformValues(EventTransformer::new)
    .groupByKey()
    .windowedBy(TimeWindows.of(windowSize).advanceBy(windowAdvance).grace(windowGrace))
    .aggregate(Frame::new,
            this::windowAggregator,
            ...
    )
    .toStream()
    .selectKey((key, value) -> value...)
    .to("output-topic", Produced.with(...));

但是如上所述,以编辑Event对象的模式为代价。

1 个答案:

答案 0 :(得分:2)

如何从windowAggregator(aggregate()处理程序)函数访问记录偏移量?

不能。在聚合之前使用transformValues()(并丰富Event对象)的方法是正确的方法。

有人提议扩展API,以允许访问aggregate()和其他DSL运营商中的记录元数据,但是它从未被推到终点(参见https://cwiki.apache.org/confluence/display/KAFKA/KIP-159%3A+Introducing+Rich+functions+to+Streams)。