处理大型卡夫卡主题

时间:2019-06-11 15:51:08

标签: apache-kafka partition

我有一个非常大的(消息数)Kafka主题,它每秒可能有超过20M消息,但是,消息大小很小,它只是一些纯文本,每个少于1KB,我可以使用几个分区每个主题,而且我可以使用多个服务器来处理一个主题,它们将消耗该主题中的一个分区... 如果我需要一台+100台服务器来解决一个巨大的话题该怎么办?

在单个主题上创建+100个或更多分区是否合乎逻辑?

3 个答案:

答案 0 :(得分:2)

在提及Kafka主题时,您应定义“大”:

  • 大容量意味着海量数据。
  • 消息大小很大,要花一些时间从队列向客户端发送消息进行处理吗?
  • 密集写那个话题?在这种情况下,您是否需要尽快处理读取? (即:我们可以将流程数据延迟大约1个小时吗?)
  • ...

无论哪种情况,您都应该在消费者方面考虑一下,以获得更好的设计主题和分区。例如:

  • 每条消息的处理时间很慢,并且更好地在消息之间进行快速处理:在这种情况下,您应该创建许多分区。就像负载平衡器和服务器之间的关系一样,您会创建许多工作人员来完成工作。
  • 如果仅某些消息类型,时间处理很慢,则应考虑移至新主题。有一篇不错的文章:Should you put several event types in the same Kafka topic解释了这个决定。
  • 消息顺序重要吗?例如,消息A发生在消息B之前,消息A应该首先处理。在这种情况下,您应该使所有相同类型的消息进入相同的分区(只有相同的分区才能保持消息顺序),或者移至单独的主题(具有单个分区)。
  • ...

在对主题和分区进行了适当的设计之后,就会出现问题:每个主题应该有多少个分区。增加总分区会增加吞吐量,但是同时会影响可用性或延迟。 how to choose number topics and partitions for Kafka cluster有一个很好的主题,它仔细地解释了每个主题的总分区将影响性能。我认为,您应该直接在系统上进行基准测试以选择正确的值。它取决于系统的许多因素:服务器计算机的处理能力,网络容量,内存...

最后一部分,您不需要100个服务器即可使用100个分区。 Kafka将尝试平衡服务器之间的所有分区,但这只是可选的。例如,如果您有1个主题,其中3个服务器上运行着7个分区,那么将有2个服务器分别存储2个分区,而1个服务器存储3个分区。 (因此2 * 2 + 3 * 1 = 7)。在较新版本的Kafka中,分区和服务器信息之间的映射将存储在zookeeper中。

答案 1 :(得分:0)

如果您更具体,并且会提供一些数字,例如每秒的预期负载以及每个邮件的大小等,您将获得更好的帮助

通常,Kafka非常强大,并且在暂挂之后将数据写入缓冲区并定期将数据刷新到磁盘。并且根据融合前一段时间的基准测试,具有6个节点的Kafka集群在下面每秒支持约80万条消息,这是基准enter image description here

答案 2 :(得分:0)

我们的朋友是对的,我推荐你这本书

Kafka,权威指南 Neha Narkhede,Gwen Shapira和Todd Palino

您可以在第 47

页找到答案
  

如何选择分区数

     

选择数量时要考虑几个因素   分区:

     
      
  • 您期望该主题的吞吐量是多少?

         

    例如,您期望每秒写入100 KB还是每秒写入1 GB   第二?

  •   
  • 从单个分区使用时,您期望达到的最大吞吐量是多少?您最多将只有一名消费者   从分区读取,所以如果您知道您的慢消费者   将数据写入数据库,而该数据库再也无法处理更多   每个线程每秒写入它的速度超过50 MB,那么您知道   从分区使用时,您的吞吐量限制为60MB。
  •   
  • 您可以执行相同的练习来估计单个分区上每个生产者的最大吞吐量,但是由于生产者   通常比消费者快得多,因此跳过通常是安全的   这个。
  •   
  • 如果您要根据密钥将消息发送到分区,则以后添加分区可能非常困难,因此请计算吞吐量   根据您将来的预期使用量,而不是当前的使用量。
  •   
  • 考虑要在每个代理上放置的分区数以及每个代理的可用磁盘空间和网络带宽。
  •   
  • 避免高估,因为每个分区都使用代理上的内存和其他资源,并且会增加领导者的时间   选举。考虑到所有这些,很明显,您想要许多   分区,但不要太多。如果您对   主题的目标吞吐量和预期的吞吐量   求和器,您可以将目标吞吐量除以预期收益   求和器吞吐量并以此方式导出分区数。所以如果我   希望能够从一个主题读写1 GB /秒,我知道   每个消费者只能处理50 MB / s,那么我至少需要20 MB   分区。这样,我可以让20位消费者从该主题中阅读   并达到1 GB /秒。如果您没有这些详细信息,我们的   经验表明,限制分区上的分区大小   每天少于6 GB的磁盘通常可以令人满意   结果。
  •