2

我们正在探索 Kafka 以协调 Spark 作业中的多个任务。每个 Spark 任务都充当同一主题上消息的生产者和消费者。到目前为止,我们看到了不错的性能,但我想知道是否有办法改进它,考虑到我们通过做与文档建议相反的事情来获得最佳性能。目前我们只使用具有多个 CPU 的单个 Broker 机器,但如果需要,我们可以使用更多。

到目前为止,我们已经尝试了以下设置:

  1. 单个主题,单个分区,多个消费者,不使用组 ID:最佳性能
  2. 单个主题、单个分区、多个消费者,每个消费者使用自己的组 ID:比(1)慢 2 倍
  3. 单个主题,单个分区,多个消费者,都使用相同的 Group ID:卡住或死慢
  4. 单个主题,与消费者一样多的分区,单个组 ID:卡住或死慢
  5. 单个主题,与消费者一样多的分区,每个分区使用自己的组 ID 或不使用组 ID:有效,但比(1)或(2)慢很多

我不明白为什么我们会按照文档的建议做事来获得最佳性能。

我的问题是:

  1. 有很多关于拥有多个分区的好处的文章,即使在单个代理上也是如此,但很明显,我们看到了性能下降。
  2. 除了弹性考虑之外,添加额外的经纪人有什么好处?我们看到,即使在压力下,我们的单个 Broker CPU 利用率也从未超过 50%。而且它更容易简单地增加单个 VM 上的 CPU 数量,而不是管理多个 VM。获得更多经纪人有什么好处吗?(出于速度考虑,而不是弹性)
  3. 如果以上为“是”,那么显然我们不能为每个消费者拥有一个代理。现在我们正在运行 30-60 个 Spark 任务,但它可以达到数百个。因此,如果每个任务都有一个分区,我们几乎不可避免地会遇到每个 Broker 负责数十个分区的情况。那么基于上述测试,我们仍然会看到更差的性能吗?

请注意,我们将生产者设置为不等待经纪人的确认,正如我们在文档中看到的那样,有许多分区会减慢速度:

生产者 = KafkaProducer(bootstrap_servers=[SERVER], acks=0)

谢谢你的想法。

4

1 回答 1

1

我认为您遗漏了一个重要概念:Kafka 每个主题分区只允许一个消费者,而可能有多个消费者组从同一个分区读取。您似乎在提交偏移或太多组重新平衡问题时遇到问题。

这是我的想法;

  1. 单个主题,单个分区,多个消费者,不使用组 ID:最佳性能

这里实际发生的是 -> 你的一个消费者是空闲的。

  1. 单个主题、单个分区、多个消费者,每个消费者使用自己的组 ID:比(1)慢 2 倍

两个消费者都在独立地获取和处理相同的消息。

  1. 单个主题,单个分区,多个消费者,都使用相同的 Group ID:卡住或死慢

只有同一组的一个成员可以从单个分区中读取。这不应给出与第一种情况不同的结果。

  1. 单个主题,与消费者一样多的分区,单个组 ID:卡住或死慢

这是每个消费者被分配到不同分区的情况。而且,这就是我们希望以最快的速度消费的情况。

单个主题,与消费者一样多的分区,每个分区使用自己的组 ID 或不使用组 ID:有效,但比(1)或(2)慢很多

第一步和第二步的评论相同。


有很多关于拥有多个分区的好处的文章,即使在单个代理上也是如此,但很明显,我们看到了性能下降。

事实上,通过拥有多个分区,我们可以并行化消费者。如果消费者具有相同的组 id,那么他们将从不同的分区消费。否则,每个消费者将从所有分区消费。

除了弹性考虑之外,添加额外的经纪人有什么好处?我们看到,即使在压力下,我们的单个 Broker CPU 利用率也从未超过 50%。而且它更容易简单地增加单个 VM 上的 CPU 数量,而不是管理多个 VM。获得更多经纪人有什么好处吗?(出于速度考虑,而不是弹性)如果以上是肯定的,那么显然我们不能为每个消费者都有一个经纪人。现在我们正在运行 30-60 个 Spark 任务,但它可以达到数百个。因此,如果每个任务都有一个分区,我们几乎不可避免地会遇到每个 Broker 负责数十个分区的情况。那么基于上述测试,我们仍然会看到更差的性能吗?

当创建一个新主题时,集群中的一个代理被选为分区领导者,所有的读/写操作都在这里处理。因此,当您有很多主题时,它会自动在代理之间分配工作量。如果您有一个包含许多主题的代理,则所有生产者/消费者都将从/向同一个代理生产/消费。

于 2021-02-22T16:59:39.937 回答