【问题标题】:Kafka Streams thread numberKafka Streams 线程数
【发布时间】:2018-06-14 20:25:05
【问题描述】:

我是 Kafka Streams 的新手,我目前对 Kafka Streams 应用程序的最大并行度感到困惑。我通过以下链接并没有得到我想要找到的答案。 https://docs.confluent.io/current/streams/faq.html#streams-faq-scalability-maximum-parallelism

如果我有 2 个输入主题,一个有 10 个分区,另一个有 5 个分区,并且只有一个 Kafka Streams 应用程序实例正在运行来处理这两个输入主题,在这种情况下我可以拥有的最大线程数是多少? 10 还是 15?

【问题讨论】:

  • 应用启动时,可以看到任务名称的格式为_。 kafka 流任务的数量由子拓扑的数量决定,而子拓扑的数量由您的整体流拓扑决定。分区数由您在每个源/主题的分区数给出。我建议你阅读这个medium.com/@andy.bryant/…

标签: apache-kafka apache-kafka-streams


【解决方案1】:

德米特里的回答似乎并不完全正确。

然后,15 个输入分区中的每一个都将映射到单个 Kafka Streams“任务”

一般不会。这取决于拓扑的“结构”。也可能只有 10 个任务。

否则,来自 Dmitry 的出色回答!

【讨论】:

  • 嗯...谢谢您的回复,您能更详细地描述一下在什么情况下会是 10 个任务吗?
  • 例如,如果你做 `stream1 = builder.stream("topic10"); stream2 = builder.stream("topic15"); stream1.merge(stream2).map().to("output)" -- 在 v1.0 中可以获得详细的运行时信息:docs.confluent.io/current/streams/monitoring.html
  • 明白了,谢谢。我不会在这两个输入主题之间执行合并或任何其他操作,它们是单独的数据流,所以在这种情况下,我最多可以有 15 个非空闲线程,对吗?
  • 我猜是这样——最好的检查方法是锁定日志——记录的创建任务——每个任务最多可以有一个线程,而不会以空闲线程结束。例如,如果您有重新分区步骤并因此得到两个子拓扑,那么任务的数量也会增加一倍。
  • 感谢指正!是的,显然这种说法通常是不正确的。但是在我在回答中引入的假设下是否正确:“假设您有一个简单的处理器拓扑,没有连接和聚合”?我也应该添加合并吗?
【解决方案2】:

如果我有 2 个输入主题,一个有 10 个分区,另一个有 5 个分区

听起来不错。所以你总共有 15 个分区。假设您有一个简单的处理器拓扑,没有连接和聚合,因此所有 15 个分区都只是进行无状态转换。

然后,15 个输入分区中的每一个都将映射到一个 Kafka Streams“任务”。如果您有 1 个线程,则来自这 15 个任务的输入将由该 1 个线程处理。如果您有 15 个线程,则每个任务将有一个专用线程来处理其输入。因此,您可以运行 1 个具有 15 个线程的应用程序或 15 个具有 1 个线程的应用程序,这在逻辑上是相似的:您在 15 个线程中处理 15 个任务。唯一的区别是 15 个应用程序和 1 个线程允许您将负载分散到 JVM 上。

同样,如果您启动 15 个应用程序实例,每个实例有 1 个线程,那么每个应用程序将被分配 1 个任务,每个应用程序中的每个 1 个线程将处理其给定的 1 个任务。

在这种情况下我可以拥有的最大线程数是多少? 10 还是 15?

您可以将最大线程数设置为任何值。如果所有任务的线程数超过任务总数,那么一些线程将保持空闲状态。


如果您还没有,我建议您阅读https://docs.confluent.io/current/streams/architecture.html#parallelism-model。此外,研究应用程序启动时产生的日志。每个线程记录分配给它的任务,如下所示:

[2018-01-04 16:45:26,859] INFO (org.apache.kafka.streams.processor.internals.StreamThread:351) stream-thread [entities-eb9c0a9b-ecad-48c1-b4e8-715dcf2afef3-StreamThread-3] partition assignment took 110 ms.
current active tasks: [0_0, 0_2, 1_2, 2_2, 3_2, 4_2, 5_2, 6_2, 7_2, 8_2, 9_2, 10_2, 11_2, 12_2, 13_2, 14_2]
current standby tasks: []
previous active tasks: []

【讨论】:

  • 非常感谢您的回答!
  • 谁能解释一下,上面的日志记录约定“当前活动任务:[0_0, 0_2]”。 0 和 2 在这种模式 '0_2' 中意味着什么?
  • 不,实际上是 _。希望它是线程,以便我可以通过查看此日志找到应用程序实例 - 线程 - 任务映射。有没有一种程序化的方式来找到这个映射?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2019-03-30
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多