Kafka 主题分区

Posted

技术标签:

【中文标题】Kafka 主题分区【英文标题】:Kafka topic partitions 【发布时间】:2018-03-01 16:59:42 【问题描述】:

关于 Kafka 的主题和分区的快速问题。假设如下场景:

Producer1 将数据写入 Topic1。

Producer2将数据写入Topic2

Consumer1 从 Topic1 和 Topic2 读取数据。

Consumer2 仅从 Topic2 读取数据。

问题是:每个Topic里面有多少个partition?真的是靠消费者数量来推动并行吗?或者它只是文件 server.config 中的一个参数集?在后一种情况下,有没有办法让不同的主题具有不同的分区数?

【问题讨论】:

【参考方案1】:

首先要了解的是,主题分区是 Kafka 中的并行单位。在生产者和代理端,对不同分区的写入可以完全并行完成。在消费者方面,Kafka 总是将单个分区的数据提供给一个消费者线程。因此,消费者(在消费者组内)的并行度受所消费的分区数量的限制。因此,一般来说,Kafka集群中的分区越多,可以达到的吞吐量就越高。

每个主题内有多少个分区?这是可配置的。您可以增加分区,但一旦增加就不能减少它。 Apache Kafka 为我们提供了 alter 命令来更改主题行为和添加/修改配置。我们将使用 alter 命令为现有主题添加更多分区。

这是将主题“my-topic”的分区计数增加到 20 的命令 -

./bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic my-topic --partitions 20

可以通过如下describe命令验证分区是否增加-

./bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-topic

您需要为一个主题设置多少个分区?请在此处阅读这篇写得很好的文档:https://www.confluent.io/blog/how-to-choose-the-number-of-topicspartitions-in-a-kafka-cluster/

【讨论】:

【参考方案2】:

可以指定创建主题时的分区数。例如,您创建了具有 40 个分区的 Topic1。现在您只开始一个消费者。这个消费者将被分配到你的 Topic1 的每个分区。

如果您想增加并行度,您可以在一个消费者组中启动多个消费者。例如,启动 10 个具有相同消费者组 id 的消费者会导致每个消费者被分配到大约 4 个分区。

仅供参考,启动 更多 个消费者(在消费者组中)比您拥有的 # 个分区没有意义 - 一些消费者将处于空闲状态。

欲了解更多信息,请查看官方 Kafka 文档:https://kafka.apache.org/documentation/#intro_consumers

【讨论】:

以上是关于Kafka 主题分区的主要内容,如果未能解决你的问题,请参考以下文章

Kafka 分区机制详解

Kafka 主题分区到 Spark 流

如何在 Kafka Connect Sink 中指定 Kafka 主题的分区

Kafka--03---kafka安装消息的细节 主题和分区的概念

kafka 获取主题的分区数

如何获取 kafka 主题分区的最新偏移量?