为什么单代理安装程序在单主题分区而不是多个分区上性能更好

rxztt3cl  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(424)

我们正在探索Kafka的协调多个任务的Spark工作。每个spark任务都充当同一主题消息的生产者和消费者。到目前为止,我们看到了不错的表现,但我想知道是否有一个方法来改善它,考虑到我们得到了最好的表现,做的事情与医生的建议相反。目前我们只使用带有多个cpu的单个代理机器,但如果需要,我们可以使用更多。
到目前为止,我们已经尝试了以下设置:
单个主题、单个分区、多个使用者、不使用组id:最佳性能
单个主题、单个分区、多个使用者(每个使用者使用自己的组id):比(1)慢2倍
单个主题、单个分区、多个使用者,都使用相同的组id:卡住或非常慢
单个主题,与使用者一样多的分区,单个组id:卡住或非常慢
单个主题,与使用者一样多的分区,每个分区使用自己的组id或不使用组id:工作正常,但比(1)或(2)慢得多
我不明白为什么我们要通过违背医生的建议来获得最好的表现。
我的问题是:
有很多关于拥有多个分区的好处的文章,即使是在一个代理上,但是很明显我们看到了性能的下降。
除了弹性方面的考虑,增加额外的经纪人还有什么好处?我们看到,即使在压力大的时候,我们的单代理cpu利用率也不会超过50%。简单地增加单个vm上的cpu数量比管理多个vm更容易。找更多的经纪人有什么好处吗(考虑到速度,而不是弹性)
如果以上是肯定的,那么显然我们不能每个消费者都有一个经纪人。现在我们正在运行30-60个spark任务,但它可能会增加到数百个。因此,如果每个任务都有一个分区,那么我们几乎不可避免地会遇到这样的情况:每个代理负责几十个分区。那么基于以上测试,我们还会看到更差的性能吗?
请注意,我们正在将生产者设置为不等待代理的确认,正如我们在文档中看到的那样,使用许多分区可以降低速度:
producer=kafkaproducer(bootstrap\u servers=[server],acks=0)
谢谢你的想法。

iyfjxgzm

iyfjxgzm1#

我认为您遗漏了一个重要的概念:kafka只允许每个主题分区有一个使用者,而可能有多个使用者组从同一分区读取内容。似乎您在提交偏移量方面有问题,或者有太多的组重新平衡问题。
这是我的想法;
单个主题、单个分区、多个使用者、不使用组id:最佳性能
这里实际发生的是->你的一个消费者是空闲的。
单个主题、单个分区、多个使用者(每个使用者使用自己的组id):比(1)慢2倍
两个使用者都独立地获取和处理相同的消息。
单个主题、单个分区、多个使用者,都使用相同的组id:卡住或非常慢
同一组中只有一个成员可以从单个分区中读取。这不应给出与第一种情况不同的结果。
单个主题,与使用者一样多的分区,单个组id:卡住或非常慢
这是每个使用者被分配到不同分区的情况。而且,在这种情况下,我们希望消费的速度和现在一样快。
单个主题,与使用者一样多的分区,每个分区使用自己的组id或不使用组id:工作正常,但比(1)或(2)慢得多
关于第一步和第二步的评论是一样的。
有很多关于拥有多个分区的好处的文章,即使是在一个代理上,但是很明显我们看到了性能的下降。
实际上,通过拥有多个分区,我们可以并行化使用者。如果使用者具有相同的组id,那么他们将从不同的分区进行消费。否则,每个使用者将使用所有分区中的数据。
除了弹性方面的考虑,增加额外的经纪人还有什么好处?我们看到,即使在压力大的时候,我们的单代理cpu利用率也不会超过50%。简单地增加单个vm上的cpu数量比管理多个vm更容易。找更多的经纪人有什么好处吗(考虑到速度,而不是弹性)如果以上是肯定的,那么显然我们不能每个消费者都有一个经纪人。现在我们正在运行30-60个spark任务,但它可能会增加到数百个。因此,如果每个任务都有一个分区,那么我们几乎不可避免地会遇到这样的情况:每个代理负责几十个分区。那么基于以上测试,我们还会看到更差的性能吗?
当创建一个新主题时,集群中的一个代理被选为分区负责人,所有读/写操作都在这里处理。因此,当您有许多主题时,它将自动在代理之间分配工作负载。如果您有一个具有多个主题的代理,那么所有生产者/消费者都将从同一个代理生产/消费到同一个代理。

相关问题