繁体   English   中英

如何减少 Kafka 主题的分区数?

[英]How to decrease number partitions Kafka topic?

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

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

但没有变化。 它仍然有 4 个分区。 有人知道吗?

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

您不能仅仅删除一个分区,因为这会导致数据丢失,并且剩余数据的键也不会正确分配,因此新消息不会被定向到与具有相同键的旧现有消息相同的分区。

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

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

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

我不买以上所有答案。 “删除分区导致数据丢失”是一个模糊的答案。 减少分区数在分布式系统中并不是什么新鲜事,事实上很多系统都支持它。 如果你能负担得起在保持数据一致性的同时重新平衡整个存储系统的开销,那么减少分区并不是不可能的事情。

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

不支持减少分区号。

您可以使用创建独立的 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() 会在内部更新主题。

Apache Kafka 为我们提供了alter 命令来改变 Topic 行为和添加/修改配置。 我们将使用 alter 命令向现有主题添加更多分区。 注意:虽然 Kafka 允许我们添加更多分区,但不可能减少主题的分区数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM