我们正在探索 Kafka 以协调 Spark 作业中的多个任务。每个 Spark 任务都充当同一主题上消息的生产者和消费者。到目前为止,我们看到了不错的性能,但我想知道是否有办法改进它,考虑到我们通过做与文档建议相反的事情来获得最佳性能。目前我们只使用具有多个 CPU 的单个 Broker 机器,但如果需要,我们可以使用更多。
到目前为止,我们已经尝试了以下设置:
- 单个主题,单个分区,多个消费者,不使用组 ID:最佳性能
- 单个主题、单个分区、多个消费者,每个消费者使用自己的组 ID:比(1)慢 2 倍
- 单个主题,单个分区,多个消费者,都使用相同的 Group ID:卡住或死慢
- 单个主题,与消费者一样多的分区,单个组 ID:卡住或死慢
- 单个主题,与消费者一样多的分区,每个分区使用自己的组 ID 或不使用组 ID:有效,但比(1)或(2)慢很多
我不明白为什么我们会按照文档的建议做事来获得最佳性能。
我的问题是:
- 有很多关于拥有多个分区的好处的文章,即使在单个代理上也是如此,但很明显,我们看到了性能下降。
- 除了弹性考虑之外,添加额外的经纪人有什么好处?我们看到,即使在压力下,我们的单个 Broker CPU 利用率也从未超过 50%。而且它更容易简单地增加单个 VM 上的 CPU 数量,而不是管理多个 VM。获得更多经纪人有什么好处吗?(出于速度考虑,而不是弹性)
- 如果以上为“是”,那么显然我们不能为每个消费者拥有一个代理。现在我们正在运行 30-60 个 Spark 任务,但它可以达到数百个。因此,如果每个任务都有一个分区,我们几乎不可避免地会遇到每个 Broker 负责数十个分区的情况。那么基于上述测试,我们仍然会看到更差的性能吗?
请注意,我们将生产者设置为不等待经纪人的确认,正如我们在文档中看到的那样,有许多分区会减慢速度:
生产者 = KafkaProducer(bootstrap_servers=[SERVER], acks=0)
谢谢你的想法。