1. 程式人生 > >為什麼Kafka中的分割槽數只能增加不能減少?

為什麼Kafka中的分割槽數只能增加不能減少?

歡迎支援《RabbitMQ實戰指南》以及關注微信公眾號:朱小廝的部落格。

當一個主題被建立之後,依然允許我們對其做一定的修改,比如修改分割槽個數、修改配置等,這個修改的功能就是由kafka-topics.sh指令碼中的alter指令所提供。
我們首先來看如何增加主題的分割槽數。以前面的主題topic-config為例,當前分割槽數為1,修改為3,示例如下:

[[email protected] kafka_2.11-2.0.0]# bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-config --partitions 3
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Adding partitions succeeded!
 
[
[email protected]
kafka_2.11-2.0.0]# bin/kafka-topics.sh --zookeeper localhost:2181/kafka --describe --topic topic-config Topic:topic-config PartitionCount:3 ReplicationFactor:1 Configs: Topic: topic-config Partition: 0 Leader: 2 Replicas: 2 Isr: 2 Topic: topic-config Partition: 1 Leader: 0 Replicas: 0 Isr: 0 Topic: topic-config Partition: 2 Leader: 1 Replicas: 1 Isr: 1

注意上面提示的告警資訊:當主題中的訊息包含有key時(即key不為null),根據key來計算分割槽的行為就會有所影響。當topic-config的分割槽數為1時,不管訊息的key為何值,訊息都會發往這一個分割槽中;當分割槽數增加到3時,那麼就會根據訊息的key來計算分割槽號,原本發往分割槽0的訊息現在有可能會發往分割槽1或者分割槽2中。如此還會影響既定訊息的順序,所以在增加分割槽數時一定要三思而後行。對於基於key計算的主題而言,建議在一開始就設定好分割槽數量,避免以後對其進行調整。

目前Kafka只支援增加分割槽數而不支援減少分割槽數。比如我們再將主題topic-config的分割槽數修改為1,就會報出InvalidPartitionException的異常,示例如下:

[[email protected] kafka_2.11-2.0.0]# bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-config --partitions 1
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Error while executing topic command : The number of partitions for a topic can only be increased. Topic topic-config currently has 3 partitions, 1 would not be an increase.
[2018-09-10 19:28:40,031] ERROR org.apache.kafka.common.errors.InvalidPartitionsException: The number of partitions for a topic can only be increased. Topic topic-config currently has 3 partitions, 1 would not be an increase.
 (kafka.admin.TopicCommand$)

為什麼不支援減少分割槽?
按照Kafka現有的程式碼邏輯而言,此功能完全可以實現,不過也會使得程式碼的複雜度急劇增大。實現此功能需要考慮的因素很多,比如刪除掉的分割槽中的訊息該作何處理?如果隨著分割槽一起消失則訊息的可靠性得不到保障;如果需要保留則又需要考慮如何保留。直接儲存到現有分割槽的尾部,訊息的時間戳就不會遞增,如此對於Spark、Flink這類需要訊息時間戳(事件時間)的元件將會受到影響;如果分散插入到現有的分割槽中,那麼在訊息量很大的時候,內部的資料複製會佔用很大的資源,而且在複製期間,此主題的可用性又如何得到保障?與此同時,順序性問題、事務性問題、以及分割槽和副本的狀態機切換問題都是不得不面對的。反觀這個功能的收益點卻是很低,如果真的需要實現此類的功能,完全可以重新建立一個分割槽數較小的主題,然後將現有主題中的訊息按照既定的邏輯複製過去即可。

雖然分割槽數不可以減少,但是分割槽對應的副本數是可以減少的,這個其實很好理解,你關閉一個副本時就相當於副本數減少了。不過正規的做法是使用kafka-reassign-partition.sh指令碼來實現,具體用法可以自行搜尋。

歡迎支援《RabbitMQ實戰指南》以及關注微信公眾號:朱小廝的部落格。

相關推薦

為什麼Kafka分割槽只能增加不能減少

歡迎支援《RabbitMQ實戰指南》以及關注微信公眾號:朱小廝的部落格。 當一個主題被建立之後,依然允許我們對其做一定的修改,比如修改分割槽個數、修改配置等,這個修改的功能就是由kafka-topics.sh指令碼中的alter指令所提供。 我們首先來看如何

Spark Streaming從Kafka獲取據,並進行實時單詞統計,統計URL出現的次數

scrip 發送消息 rip mark 3.2 umt 過程 bject ttr 1、創建Maven項目 創建的過程參考:http://blog.csdn.net/tototuzuoquan/article/details/74571374 2、啟動Kafka A:安裝ka

探討kafka分割槽與多執行緒消費

kafka算是很麻煩的一件事兒,起因是最近需要採集大量的資料,原先是隻用了典型的high-level Consumer的API,最經典的不過如下:   [java] view plain copy

kafka分割槽與多執行緒消費

kafka算是很麻煩的一件事兒,起因是最近需要採集大量的資料,原先是隻用了典型的high-level Consumer的API,最經典的不過如下: Properties props = new Properties();            

如何確定Kafka分割槽、key和consumer執行緒 【原創】如何確定Kafka分割槽、key和consumer執行緒

【原創】如何確定Kafka的分割槽數、key和consumer執行緒數   在Kafak中國社群的qq群中,這個問題被提及的比例是相當高的,這也是Kafka使用者最常碰到的問題之一。本文結合Kafka原始碼試圖對該問題相關的因素進行探討。希望對大家有所幫助。

如何確定Kafka分割槽、key和consumer執行緒、以及不消費問題解決

在Kafak中國社群的qq群中,這個問題被提及的比例是相當高的,這也是Kafka使用者最常碰到的問題之一。本文結合Kafka原始碼試圖對該問題相關的因素進行探討。希望對大家有所幫助。 怎麼確定分割槽數? “我應該選擇幾個分割槽?”——如果你在Kafka中國社群的群裡,

CRM如何在新增模塊增加產品明細並從其他模塊

配置說明 tail edi == img chang lis htm 分享 一、如何在新增模塊中增加產品明細模塊並從其他模塊中取數 1、新增一個功能模塊如:CRM_MODULE_1 2、打開X:\MYOA\webroot\general\crm\apps\crm\mod

kafka 並發配置過程踩到的坑 InstanceAlreadyExistsException

static 靜態初始化塊 obj -c 異常 判斷 con lba comm 2017-07-05 13:09:15.460 [kafka_spout:7-MultipleThreadSpoutExecutors] WARN o.a.kafka.common.utils.

元素的動態增加和刪除

solid line point ont block mar 增加 cli image 1 <div class="ser-pup-line1"> 2 <div

歷史性難題——如何為Kafka挑選合適的分割槽

作者:朱小廝 來源:朱小廝的部落格 如何為Kafka挑選合適的分割槽數?很多人都為這個問題傷過腦筋。 從吞吐量方面考慮,增加合適的分割槽數可以很大程度上提升整體吞吐量,但是超過對應的閾值之後吞吐量不升反降。如果應用對吞吐量有著一定程度上的要求,建議在投入生產環境之前對同款硬體資源

Spark任務如何確定spark分割槽、task數目、core、worker節點個數、excutor數量

先上圖: 每一個過程的任務數,對應一個inputSplit1, Partition 輸入可能以多個檔案的形式儲存在HDFS上,每個File都包含了很多塊,稱為Block。 當Spark讀取這些檔案作為輸入時,會根據具體資料格式對應的InputFormat進行解析

Tomcat 連線與執行緒池詳解 | BIO/NIO有何不同 | 簡談Kafka的NIO網路通訊模型

前言 在使用tomcat時,經常會遇到連線數、執行緒數之類的配置問題,要真正理解這些概念,必須先了解Tomcat的聯結器(Connector)。 在前面的文章 詳解Tomcat配置檔案server.xml 中寫到過:Connector的主要功能,是接收連線請求,建立Req

Java對日期進行增加天數、月、年

有時我們需要對時間資料進行處理,比如日期增加一天,增加一個月,下面是程式碼: import java.util.Date; int Day = 1; Calendar calendar = new GregorianCalendar();  // 定義calendar物件

檢視當前伺服器的所有的topic,建立topic,刪除topic,通過shell命令傳送訊息,通過shell消費訊息,檢視topic詳情,對分割槽進行修改

一、 Kafka常用操作命令  檢視當前伺服器中的所有topic [root@hadoop3 kafka]# bin/kafka-topics.sh --list --zookeeper hadoop11:2181 [root@hadoop3 kafk

Apache Kafka程式設計入門指南:設定分割槽和複製因子

我們學習瞭如何編寫簡單的Kafka Producer程式。在那個例子中,在如果需要傳送的topic不存在,Producer將會建立它。我們都知道(假設你知道),每個topic都是有分割槽數和複製因子的,但是我們無法通過Producer相關的API設定分割槽數和複製因子的,

jsp讀取據庫內容(一)

reat cor mysq ava roo 數據 state imp nav 在jsp中將數據庫表格內容讀出為一個表格,並在表格中添加超鏈接: 1 <%@ page language="java" contentType="text/html; charset=U

按照字符串組進行排序的方法(python)

正則表達 mil uil () false 解決 lam font .cn 有時候處理數據時,想要按照字符串中的數字的大小進行排序。 譬如,存在一組記錄文件,分別為‘1.dat’,‘2.dat‘... 當我把該文件夾中的所有記錄文件名讀到一個列表中,這些字符串的排列方式為:

萬網備份據操作

content ftp工具 nload 放置 生成 enter fcm filezilla 才幹 這段時間跟一哥們搞了一個教程類站點http://www.freeitjc.com。主要是放置精品課程。實現資源的免費共享。然後把這個掛到萬網上去了。用的阿裏雲s

使用fastJSON解析HashMap

new println reference log fastjson 使用 sta map.entry get import java.util.HashMap; import java.util.Iterator; import java.util.Map;

據 備份 和 恢復

delete -- lac values reat varchar let color into -- 建表 create table emp( sid int(8) primary key, sname varchar(10), sex varchar(2), chu