Apache kafka 如何减少卡夫卡主题的分区数?

Apache kafka 如何减少卡夫卡主题的分区数?,apache-kafka,Apache Kafka,我在Kafka上创建了一个带有4个分区的主题。(设置默认值number.partition=4)。现在我想把这个主题的数字分区改为3。 我试过跑步 ./bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic my-topic --partitions 3 但是没有变化。它仍然有4个分区。 任何人都知道这一点吗?不支持减少分区号。您不能只删除一个分区,因为这会导致数据丢失,并且剩余数据的密钥也不会正确分发,因此新消息不会像具有

我在Kafka上创建了一个带有4个分区的主题。(设置默认值
number.partition=4
)。现在我想把这个主题的数字分区改为3。 我试过跑步

./bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic my-topic --partitions 3
但是没有变化。它仍然有4个分区。
任何人都知道这一点吗?

不支持减少分区号。

您不能只删除一个分区,因为这会导致数据丢失,并且剩余数据的密钥也不会正确分发,因此新消息不会像具有相同密钥的旧现有消息一样定向到相同的分区

出于上述原因,Kafka不支持减少现有主题的分区数

您可以做的是创建一个包含3个分区的新主题,然后编写一个小程序(或使用现有的复制工具)将数据从旧的4分区主题复制到新的3分区主题。这样,您将通过同一个分区运行所有内容,并且所有键控消息都将在正确的分区中结束。一旦您对数据被全部复制感到满意,那么就删除原来的4分区主题


如果必须保留与原始主题相同的主题名称,则只需使用原始名称创建一个新主题,从重新分区的主题复制回数据,然后删除该临时重新分区主题。

Apache Kafka不支持减少分区号。您应该将主题作为一个整体来看待,分区是一种向外扩展以提高性能的方法。因此,发送到topic的所有数据都流向所有分区,删除其中一个分区意味着数据丢失。

您可以使用创建独立java程序来实现相同的目的,即使用AdminUtils增加和减少分区和复制

导入org.I0Itec.zkclient.zkclient

导入kafka.admin.AdminUtils

导入kafka.utils.ZKStringSerializer$

导入kafka.utils.ZkUtils

导入scala.collection.Seq

导入scala.collection.Map

public PartitionCreator(String zkhost, String topicName, int partitions, int replifactor) {
    ZkClient zkClient = new ZkClient(zkhost, 30000, 30000, ZKStringSerializer$.MODULE$);
    zkUtils = ZkUtils.apply(zkClient, false);

    this.topicName = topicName;
    this.partitions = partitions;
    this.replifactor = replifactor;
}

public void createPartion() {

    AdminUtils.createTopic(zkUtils, topicName, partitions, replifactor, new Properties());
    System.out.println("created/updated topic..");
}

注意:如果主题不可用,createTopic()会在内部更新主题。

我不相信上述所有答案。“删除分区会导致数据丢失”是一个模糊的答案。减少分区数在分布式系统中并不是一件新鲜事,事实上许多系统都支持它。如果您能够承担在保持数据一致性的同时重新平衡整个存储系统的开销,那么减少分区并不是不可能的事


在我看来,Kafka不支持减少分区数的真正原因是因为Kafka的一个重要属性:Kafka保证每个分区内消息的顺序,但不保证分区之间消息的顺序(但这是可能的)。这种排序属性在许多用例中是至关重要的。由于要删除其中一个分区,在保留顺序的同时将删除分区中的消息重新分发到其他分区是不可能的,因为分区之间的顺序无法保证。无论您如何在删除的分区中分发数据,都会破坏您分发到的任何分区的顺序保证属性。如果Kafka不关心每个分区内消息的顺序,则可以很容易地支持减少分区数。

另一个选项是将4个分区增加到6个分区,然后您的3个使用者将只获得2个分区,并且仍然保持平衡。但是,您将丢失跨分区的邮件排序。谢谢您的指导,因为我不能接受多个答案,所以我只接受第一个答案。但我非常感谢您。+1
Kafka保证每个分区内消息的顺序,但不保证分区之间消息的顺序(但这是可能的)。