我在Kafka上创建了一个有4个分区的主题(设置默认值 number.partition=4 ). 现在我想把这个主题的数字分区改为3。我试过跑步
number.partition=4
./bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic my-topic --partitions 3
但是没有变化。它仍然有4个分区。有人知道吗?
plupiseo1#
您可以使用create standalone java程序来实现相同的功能,即使用adminitils增加和减少分区和复制。导入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()会在内部更新主题。
cczfrluj2#
不支持减少分区号。
tcomlyy63#
apachekafka不支持减少分区号。您应该将主题看作一个整体,分区是一种扩展以提高性能的方法。因此,发送到主题的所有数据都将流向所有分区,删除其中一个分区意味着数据丢失。
x8diyxa74#
不能只删除分区,因为这样会导致数据丢失,而且剩余数据的密钥也不会正确分发,因此新消息不会像具有相同密钥的旧现有消息一样定向到相同的分区。基于上述原因,kafka不支持减少现有主题的分区数。您可以做的是创建一个包含3个分区的新主题,然后编写一个小程序(或使用现有的复制工具)将数据从原来的4个分区主题复制到新的3个分区主题。这样,您将通过同一分区器运行所有内容,并且所有键入的消息都将最终位于正确的分区中。一旦您对数据被全部复制感到满意,那么就删除原来的4分区主题。如果必须保留与原始主题相同的主题名称,则只需使用原始名称创建一个新主题,从重新分区的主题中复制数据,然后删除临时重新分区的主题。
4条答案
按热度按时间plupiseo1#
您可以使用create standalone java程序来实现相同的功能,即使用adminitils增加和减少分区和复制。
导入org.i0itec.zkclient.zkclient;
导入kafka.admin.adminutils;
导入kafka.utils.zkstringserializer$;
导入kafka.utils.zkutils;
导入scala.collection.seq;
导入scala.collection.map;
注意:如果主题不可用,createtopic()会在内部更新主题。
cczfrluj2#
不支持减少分区号。
tcomlyy63#
apachekafka不支持减少分区号。您应该将主题看作一个整体,分区是一种扩展以提高性能的方法。因此,发送到主题的所有数据都将流向所有分区,删除其中一个分区意味着数据丢失。
x8diyxa74#
不能只删除分区,因为这样会导致数据丢失,而且剩余数据的密钥也不会正确分发,因此新消息不会像具有相同密钥的旧现有消息一样定向到相同的分区。
基于上述原因,kafka不支持减少现有主题的分区数。
您可以做的是创建一个包含3个分区的新主题,然后编写一个小程序(或使用现有的复制工具)将数据从原来的4个分区主题复制到新的3个分区主题。这样,您将通过同一分区器运行所有内容,并且所有键入的消息都将最终位于正确的分区中。一旦您对数据被全部复制感到满意,那么就删除原来的4分区主题。
如果必须保留与原始主题相同的主题名称,则只需使用原始名称创建一个新主题,从重新分区的主题中复制数据,然后删除临时重新分区的主题。