Kafka 流中最有效的线程数
Most efficient number of threads in Kafka streams
我正在使用一个主题的 Kafka Streams(有 3 个分区)。
我想知道 Kafka Streams num.stream.threads 选项中最有效的线程数。
1个线程和3个任务 VS 3个线程和1个任务(在每个线程中)哪个更好?
P.S。服务器有 3 个核心 CPU.
答案是,这取决于!通常,拥有与 partitions/tasks 一样多的线程会更有效率,因为这会给您带来更好的并行性。但是如果你没有足够的CPU.
,那么线程太多也可能是灾难性的context switch
您还必须考虑要处理的数据的吞吐量,以及对每条记录执行操作的成本。如果您的流应用程序不是真正的数据密集型应用程序,您可能没有兴趣分配大量线程,因为它们大部分时间都是空闲的。
因此最好从单线程开始并执行负载测试以衡量应用程序的性能。为此,您可以使用 Apache kafka(或 Confluent)发行版中可用的 command-line 工具,即 bin/kafka-producer-perf-test.sh
并使用 JMX 监控 Kafka Streams 公开的指标(请参阅:Monitoring Kafka Streams - Confluent Documentation ).
此外,您应该注意,您可以分配给应用程序的最大线程数并不完全等于您在拓扑中声明的输入主题的分区数。实际上,您还应该考虑应用程序生成的所有 sub-topologies 中的所有主题。
例如,假设您正在使用具有 3 个分区的流主题,但您的应用程序执行重新分区操作。然后,您将得到两个 sub-topologies,每个消耗一个主题和 3 个分区。所以你总共会有 6 个任务,这意味着你最多可以配置 6 个线程。
注意:通常情况下,建议部署单线程的KafkaStreams实例,并通过增加实例水平扩展。这简化了缩放模型,尤其是在使用 Kubernetes 时(即 1 个 pod = 1 个 KafkaStreams 实例 = 1 个线程)。
我正在使用一个主题的 Kafka Streams(有 3 个分区)。
我想知道 Kafka Streams num.stream.threads 选项中最有效的线程数。
1个线程和3个任务 VS 3个线程和1个任务(在每个线程中)哪个更好?
P.S。服务器有 3 个核心 CPU.
答案是,这取决于!通常,拥有与 partitions/tasks 一样多的线程会更有效率,因为这会给您带来更好的并行性。但是如果你没有足够的CPU.
,那么线程太多也可能是灾难性的context switch您还必须考虑要处理的数据的吞吐量,以及对每条记录执行操作的成本。如果您的流应用程序不是真正的数据密集型应用程序,您可能没有兴趣分配大量线程,因为它们大部分时间都是空闲的。
因此最好从单线程开始并执行负载测试以衡量应用程序的性能。为此,您可以使用 Apache kafka(或 Confluent)发行版中可用的 command-line 工具,即 bin/kafka-producer-perf-test.sh
并使用 JMX 监控 Kafka Streams 公开的指标(请参阅:Monitoring Kafka Streams - Confluent Documentation ).
此外,您应该注意,您可以分配给应用程序的最大线程数并不完全等于您在拓扑中声明的输入主题的分区数。实际上,您还应该考虑应用程序生成的所有 sub-topologies 中的所有主题。
例如,假设您正在使用具有 3 个分区的流主题,但您的应用程序执行重新分区操作。然后,您将得到两个 sub-topologies,每个消耗一个主题和 3 个分区。所以你总共会有 6 个任务,这意味着你最多可以配置 6 个线程。
注意:通常情况下,建议部署单线程的KafkaStreams实例,并通过增加实例水平扩展。这简化了缩放模型,尤其是在使用 Kubernetes 时(即 1 个 pod = 1 个 KafkaStreams 实例 = 1 个线程)。