我正在使用一个主题的kafka流(有3个分区)。我想知道kafka streams num.stream.threads选项中最有效的线程数。1个线程和3个任务与3个线程和1个任务(在每个线程中)哪个更好?p、 服务器有3个核心cpu。
vsnjm48y1#
答案是,视情况而定!通常情况下,拥有尽可能多的线程作为分区/任务会更有效,因为这样可以提供更好的并行性。但是,如果没有足够的cpu,由于上下文切换,线程太多也可能是灾难性的。您还必须考虑要处理的数据的吞吐量,以及要对每个记录执行的操作的成本。如果您的流应用程序不是真正的数据密集型应用程序,那么您可能没有兴趣分配大量的线程,因为它们大部分时间都是空闲的。因此,最好从一个线程开始,执行负载测试来衡量应用程序的性能。为此,可以使用ApacheKafka(或confluent)发行版中提供的命令行工具,即。, bin/kafka-producer-perf-test.sh 并使用jmx监控kafka流公开的度量(请参阅:监控kafka流-合流文档)。此外,您应该注意,可以分配给应用程序的最大线程数并不完全等于您在拓扑中声明的输入主题的分区数。实际上,您还应该考虑应用程序生成的所有子拓扑中的所有主题。例如,假设您正在使用一个具有3个分区的流主题,但是您的应用程序执行了一个重新分区操作。然后,您将得到两个子拓扑,每个子拓扑使用一个主题和3个分区。因此,您总共有6个任务,这意味着您最多可以配置6个线程。注意:通常,建议使用单个线程部署kafkastreams示例,并通过添加更多示例进行水平扩展。这简化了缩放模型,特别是在使用kubernetes时(即1个pod=1个kafkastreams示例=1个线程)。
bin/kafka-producer-perf-test.sh
1条答案
按热度按时间vsnjm48y1#
答案是,视情况而定!通常情况下,拥有尽可能多的线程作为分区/任务会更有效,因为这样可以提供更好的并行性。但是,如果没有足够的cpu,由于上下文切换,线程太多也可能是灾难性的。
您还必须考虑要处理的数据的吞吐量,以及要对每个记录执行的操作的成本。如果您的流应用程序不是真正的数据密集型应用程序,那么您可能没有兴趣分配大量的线程,因为它们大部分时间都是空闲的。
因此,最好从一个线程开始,执行负载测试来衡量应用程序的性能。为此,可以使用ApacheKafka(或confluent)发行版中提供的命令行工具,即。,
bin/kafka-producer-perf-test.sh
并使用jmx监控kafka流公开的度量(请参阅:监控kafka流-合流文档)。此外,您应该注意,可以分配给应用程序的最大线程数并不完全等于您在拓扑中声明的输入主题的分区数。实际上,您还应该考虑应用程序生成的所有子拓扑中的所有主题。
例如,假设您正在使用一个具有3个分区的流主题,但是您的应用程序执行了一个重新分区操作。然后,您将得到两个子拓扑,每个子拓扑使用一个主题和3个分区。因此,您总共有6个任务,这意味着您最多可以配置6个线程。
注意:通常,建议使用单个线程部署kafkastreams示例,并通过添加更多示例进行水平扩展。这简化了缩放模型,特别是在使用kubernetes时(即1个pod=1个kafkastreams示例=1个线程)。