Kafka Streams任务分配

时间:2019-11-20 08:08:48

标签: java apache-kafka apache-kafka-streams

我有一个运行有一个线程的Kafka-Streams应用程序,可以很好地处理一个分区的主题。

我需要运行此应用程序的多个实例,同时处理不同的主题。在我目前的情况下,所有主题都只有一个分区。

当我运行同一应用程序(具有相同的 APPLICATION_ID )的新实例时,处理不同的主题时,Streams客户端不会在此新应用程序中创建新任务。第一个实例继续处理任务0_0中的第一个主题,第二个实例在没有分配分区的情况下等待。

我知道我只使用一个分区的主题,但是在这种情况下,如果我有两个实例和两个带有一个分区的主题要处理而成为两个分区,那为什么不能同时处理两个主题和一个分区呢?在同一时间,在每个实例上?

我怀疑它与 StreamsPartitionAssignor 有关,但是该分配策略在Kafka Streams应用程序中无法更改:

  

Kafka Streams不允许使用自定义分区分配器。如果   您自己设置一个,它将被覆盖   StreamsPartitionAssignor [1]。这是确保-如果   可能-将分区重新分配给相同的使用者(也就是   粘性)。

编辑:

应用程序的拓扑:

[2019-11-20 09:36:35,406] [INFO] stream-thread [avro-to-json-d07ad9ad-f4b6-4787-96cf-19c48e72ad46-StreamThread-1] Starting (org.apache.kafka.streams.processor.internals.StreamThread)
[2019-11-20 09:36:35,407] [INFO] stream-thread [avro-to-json-d07ad9ad-f4b6-4787-96cf-19c48e72ad46-StreamThread-1] State transition from CREATED to RUNNING (org.apache.kafka.streams.processor.internals.StreamThread)
[2019-11-20 09:36:35,407] [INFO] stream-client [avro-to-json-d07ad9ad-f4b6-4787-96cf-19c48e72ad46] Started Streams client (org.apache.kafka.streams.KafkaStreams)
Topologies:
   Sub-topology: 0
    Source: KSTREAM-SOURCE-0000000000 (topics: [])
      --> KSTREAM-MAP-0000000001
    Processor: KSTREAM-MAP-0000000001 (stores: [])
      --> KSTREAM-MAP-0000000002
      <-- KSTREAM-SOURCE-0000000000
    Processor: KSTREAM-MAP-0000000002 (stores: [])
      --> KSTREAM-TRANSFORM-0000000003
      <-- KSTREAM-MAP-0000000001
    Processor: KSTREAM-TRANSFORM-0000000003 (stores: [])
      --> KSTREAM-SINK-0000000004
      <-- KSTREAM-MAP-0000000002
    Sink: KSTREAM-SINK-0000000004 (extractor class: kafka.AvroToJson$$Lambda$97/741730375@957e06)
      <-- KSTREAM-TRANSFORM-0000000003

1 个答案:

答案 0 :(得分:4)

如果我对您的理解正确,则除了输入主题之外,您将使用相同的application.id和相同的拓扑来运行两个Streams客户端。这意味着由于输入主题的不同,您可以有效地在Streams客户端上运行两个不同的Streams应用程序。使用application.id运行两个不同的Streams应用程序是未定义的行为,因为application.id在Kafka集群中必须唯一(请参见https://kafka.apache.org/23/documentation/#streamsconfigs)。

您可以

  1. 增加一个主题的分区,并将该主题用作两个Streams应用程序中的输入主题(使它们成为同一应用程序),或者
  2. 更改两个应用程序之一的application.id

请注意,选项1使您可以自动重新平衡Streams客户端之间的工作量,而选项2没有。