當(dāng)一個(gè)主題被創(chuàng)建之后僧凤,依然允許我們對(duì)其做一定的修改,比如修改分區(qū)個(gè)數(shù)元扔、修改配置等躯保,這個(gè)修改的功能就是由kafka-topics.sh腳本中的alter指令所提供。
我們首先來看如何增加主題的分區(qū)數(shù)澎语。
以前面的主題topic-config為例途事,當(dāng)前分區(qū)數(shù)為1,修改為3:
注意上面提示的告警信息:當(dāng)主題中的消息包含有key時(shí)(即key不為null)擅羞,根據(jù)key來計(jì)算分區(qū)的行為就會(huì)有所影響尸变。
當(dāng)topic-config的分區(qū)數(shù)為1時(shí),不管消息的key為何值减俏,消息都會(huì)發(fā)往這一個(gè)分區(qū)中召烂;
當(dāng)分區(qū)數(shù)增加到3時(shí),那么就會(huì)根據(jù)消息的key來計(jì)算分區(qū)號(hào)娃承,原本發(fā)往分區(qū)0的消息現(xiàn)在有可能會(huì)發(fā)往分區(qū)1或者分區(qū)2中奏夫,如此還會(huì)影響既定消息的順序怕篷,所以在增加分區(qū)數(shù)時(shí)一定要三思而后行。
對(duì)于基于key計(jì)算的主題而言桶蛔,建議在一開始就設(shè)置好分區(qū)數(shù)量匙头,避免以后對(duì)其進(jìn)行調(diào)整。
目前Kafka只支持增加分區(qū)數(shù)而不支持減少分區(qū)數(shù)仔雷。
比如我們?cè)賹⒅黝}topic-config的分區(qū)數(shù)修改為1蹂析,就會(huì)報(bào)出InvalidPartitionException的異常,示例如下:
為什么不支持減少分區(qū)碟婆?
按照Kafka現(xiàn)有的代碼邏輯而言电抚,此功能完全可以實(shí)現(xiàn),不過也會(huì)使得代碼的復(fù)雜度急劇增大竖共。
實(shí)現(xiàn)此功能需要考慮的因素很多蝙叛,比如刪除掉的分區(qū)中的消息該作何處理?
如果隨著分區(qū)一起消失則消息的可靠性得不到保障公给;
如果需要保留則又需要考慮如何保留借帘,直接存儲(chǔ)到現(xiàn)有分區(qū)的尾部,消息的時(shí)間戳就不會(huì)遞增淌铐,如此對(duì)于Spark肺然、Flink這類需要消息時(shí)間戳(事件時(shí)間)的組件將會(huì)受到影響;
如果分散插入到現(xiàn)有的分區(qū)中腿准,那么在消息量很大的時(shí)候际起,內(nèi)部的數(shù)據(jù)復(fù)制會(huì)占用很大的資源,而且在復(fù)制期間吐葱,此主題的可用性又如何得到保障街望?
同時(shí),順序性問題弟跑、事務(wù)性問題灾前、以及分區(qū)和副本的狀態(tài)機(jī)切換問題都是不得不面對(duì)的。
反觀這個(gè)功能的收益點(diǎn)卻是很低孟辑,如果真的需要實(shí)現(xiàn)此類的功能哎甲,完全可以重新創(chuàng)建一個(gè)分區(qū)數(shù)較小的主題,然后將現(xiàn)有主題中的消息按照既定的邏輯復(fù)制過去即可扑浸。
雖然分區(qū)數(shù)不可以減少烧给,但是分區(qū)對(duì)應(yīng)的副本數(shù)是可以減少的燕偶,這個(gè)其實(shí)很好理解喝噪,你關(guān)閉一個(gè)副本時(shí)就相當(dāng)于副本數(shù)減少了。
不過正規(guī)的做法是使用kafka-reassign-partition.sh腳本來實(shí)現(xiàn)指么,具體用法可以自行搜索酝惧。
參考?
為什么Kafka中的分區(qū)數(shù)只能增加不能減少榴鼎?
https://honeypps.com/mq/why-can-paritions-number-of-kafka-only-increase-but-not-decrease/