簡體   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