一个名为“addcash”的主题,它有3个分区(kafka集群机的数量也是3个),其中有大量的用户充值消息流。我每天都要数钱的总数。我从一些关于kafka流的文章中了解到:kafka流将拓扑作为任务运行,任务的数量取决于主题分区的数量,并且每个任务都有单独的状态存储。所以,当我按状态stroe计算总货币数时,是否有三个值,而不是一个总值将被返回?正确的方法是什么?谢谢!
k4emjkb11#
这是正确的。有两种方法:你做部分求和,那是一个后续步骤 KTable.groupBy(...).reduce(...) 并设置一个全局键以将所有部分聚集在一起。您可以通过创建一个附加的单分区主题来获得总的和,将部分结果写入该主题,用kafkastreams读回数据,然后进行第二次聚合,将这些部分数字相加。你可以用一个程序用 through("my-single-partition-topic"); 连接聚合的第一部分和第二部分。你需要使用 transform() 而不是dsl来为这个解决方案执行第二个聚合步骤。
KTable.groupBy(...).reduce(...)
through("my-single-partition-topic");
transform()
1条答案
按热度按时间k4emjkb11#
这是正确的。
有两种方法:
你做部分求和,那是一个后续步骤
KTable.groupBy(...).reduce(...)
并设置一个全局键以将所有部分聚集在一起。您可以通过创建一个附加的单分区主题来获得总的和,将部分结果写入该主题,用kafkastreams读回数据,然后进行第二次聚合,将这些部分数字相加。你可以用一个程序用
through("my-single-partition-topic");
连接聚合的第一部分和第二部分。你需要使用transform()
而不是dsl来为这个解决方案执行第二个聚合步骤。