繁体   English   中英

使用 Kafka 流进行聚合和分组

[英]Aggregation & grouping with Kafka streams

我正在研究卡夫卡流和国营商店。 我在下面有一个逻辑来根据键聚合消息组。

 final Materialized<String, Sample, SessionStore<Bytes, byte[]>> abcStore =
            Materialized.<String, Sample, SessionStore<Bytes, 
 byte[]>>as("topicforchangelog").withCachingDisabled();


 KStream<String, Sample> abcStream = builder.stream("inprocess-topic");


 SessionWindowedKStream<String, Sample> windowedKStream =
            abcStream.groupByKey().windowedBy(SessionWindows.with(ofSeconds("36000")));


    windowedKStream
            .aggregate(
                    Aggregater::initialize,
                    Aggregater::merge,
                    Aggregater::merge,
                    abcStore)
            .toStream()
            .map((key, value) -> KeyValue.pair(key.key(), value))
            .filter((k, v) -> v != null )
            .selectKey((key, value) -> value.getId())
            .peek(abcClass::logOut)
            .to("outputtopic");

基于 Aggregate 类中的逻辑,我能够按预期合并以下消息。

 Message 1 : Key : A , value : {"id" : "abc" , "names" : []} 

 Message 2 : Key : A , value : {"id" : null , "names" : [{"name" : "x"}]}

 Message 3 : Key : A , value : {"id" : null , "names" : [{"name" : "xx"}]}

我得到的最后一条消息如下。

 {"id" : "abc" , "names" : [{"name" : "x"}, {"name" : "xx"}]}

三条消息5分钟被推送到主题 _ _ _ 但是经过一段时间一天长时间 如果发送一条带有密钥“A”消息-

 Message 4 : Key : A , value : {"id" : null ,  "names" : [{"name" : "xxx"}}

我的期望是形成一个像

{"id" : "abc" , "names" : [{"name" : "x"}, {"name" : "xx"},{"name" : "xxx"}]}

但它没有发生。 我收到类似 {"id" : null , "names" : [{"name" : "xxx"}} 的输出

以“A”为键的“inprocess-topic”中存在的所有记录并未发生聚合。

这是因为

  1. 会话窗口是否过期?
  2. (或)因为消费者应用程序已经读取了先前的消息并且提交了偏移量?

我们可以用 SessionWindow 概念来实现这个场景吗?

只是一个疯狂的猜测。 因为您使用的是窗口聚合,所以您可能需要考虑以下事项。

KGroupedTable/Streame 的详细行为

  • 具有空键的输入记录将被忽略。
  • 当第一次收到记录键时,调用初始化器(并在加法器和减法器之前调用)。 请注意,与 KGroupedStream 相比,随着时间的推移,由于已接收到该键的输入墓碑记录,因此可能会多次调用该键的初始化程序(见下文)。
  • 当接收到键的第一个非空值时(例如,INSERT),则只调用加法器。
  • 当接收到一个键的后续非空值时(例如,UPDATE),然后(1)使用存储在表中的旧值调用减法器,以及(2)使用输入记录的新值调用加法器那是刚收到的。 未定义减法器和加法器的执行顺序。
  • 当一个墓碑记录——即一个具有空值的记录——被接收到一个键(例如,DELETE)时,那么只有减法器被调用。 请注意,只要减法器本身返回空值,就会从结果 KTable 中删除相应的键。 如果发生这种情况,该键的任何下一个输入记录将再次触发初始化程序。

请参阅表中的第 6 行。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM