我有一个非常简单的KafkaStreams应用程序。它看起来像这样:
input topic --> extract smth., update aggregate in the local state -> output topic
一开始,输入主题只有1个分区,一切顺利。
但是在我增加输入主题中的分区数量后,我发现我的应用程序是按分区实例化的,所以我的输出主题有多个更新(每个分区1个更新)而不是单个更新。
我该如何处理这种情况?我希望我的应用程序只生成所有输入分区的一个聚合。
答案 0 :(得分:2)
Kafka Streams按分区并行化,因此,您只能通过使用单个分区主题来执行此操作。
如果您无法控制输入主题的主题数,则可以使用单个分区创建中间主题,并通过此分区路由所有数据。
KStream multiPartitionInputStream = ...
multiPartitionInputStream.through("single-partitioned-topic")...
注意:执行全局聚合不会水平扩展,因此,应谨慎使用此模式。
<强>更新强>
对于处理器API用户,您还可以通过config PartitionGrouper
提供自定义"partition.grouper"
,创建单个任务并为此任务分配所有/所有分区。
注意:非常不鼓励为DSL使用提供自定义PartitionGrouper,因为需要了解许多内部细节和假设才能编写正确的
PartitionGrouper
。