Kafka Streams 任务分配

kur*_*uro 4 java apache-kafka apache-kafka-streams

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

我需要同时运行此应用程序的多个实例来处理不同的主题。在我当前的场景中,所有主题都只有一个分区。

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

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

我怀疑它与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
Run Code Online (Sandbox Code Playgroud)

Bru*_*nna 5

如果我理解正确,您会运行两个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 则不会。