KafkaStreams中的本地状态存储

时间:2017-10-20 04:25:57

标签: apache-kafka apache-kafka-streams

我有一个非常简单的KafkaStreams应用程序。它看起来像这样:

input topic --> extract smth., update aggregate in the local state -> output topic

一开始,输入主题只有1个分区,一切顺利。

但是在我增加输入主题中的分区数量后,我发现我的应用程序是按分区实例化的,所以我的输出主题有多个更新(每个分区1个更新)而不是单个更新。

我该如何处理这种情况?我希望我的应用程序只生成所有输入分区的一个聚合。

1 个答案:

答案 0 :(得分:2)

Kafka Streams按分区并行化,因此,您只能通过使用单个分区主题来执行此操作。

如果您无法控制输入主题的主题数,则可以使用单个分区创建中间主题,并通过此分区路由所有数据。

KStream multiPartitionInputStream = ...
multiPartitionInputStream.through("single-partitioned-topic")...
  

注意:执行全局聚合不会水平扩展,因此,应谨慎使用此模式。

<强>更新

对于处理器API用户,您还可以通过config PartitionGrouper提供自定义"partition.grouper",创建单个任务并为此任务分配所有/所有分区。

  

注意:非常不鼓励为DSL使用提供自定义PartitionGrouper,因为需要了解许多内部细节和假设才能编写正确的PartitionGrouper