【问题标题】:Kafka Streams task assignmentKafka Streams 任务分配
【发布时间】:2019-11-20 08:08:48
【问题描述】:

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

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

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

我知道我只使用一个分区的主题,但在这种情况下,如果我有两个实例和两个主题,一个分区要处理,这会产生两个分区,¿为什么不能处理具有单个分区的两个主题同时,在每个实例中都打开?

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

Kafka Streams 不允许使用自定义分区分配器。如果 您自己设置一个,它将被覆盖 StreamsPartitionAssignor [1]。这需要确保——如果 可能——分区被重新分配给相同的消费者(a.k.a. 粘性)在重新平衡期间。

编辑:

应用的拓扑:

[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

【问题讨论】:

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


    【解决方案1】:

    如果我对您的理解正确,您可以运行两个具有相同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 则不能。

    【讨论】:

    • 你完全正确。我不明白 Streams 客户端和 application.id 之间的关系。我在两个客户端中使用不同的 application.id 进行了测试,它按预期工作。非常感谢您的帮助!
    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多