1. “消費(fèi)組中的消費(fèi)者個數(shù)如果超過topic的分區(qū),那么就會有消費(fèi)者消費(fèi)不到數(shù)據(jù)”這句話是否正確?如果正確,那么有沒有什么hack的手段?
答案:正確,可以通過自定義分區(qū)分配策略,將消費(fèi)者指定到某個分區(qū)
2. 有哪些情形會造成重復(fù)消費(fèi)或消息丟失?
答案:
1)當(dāng)poll部分消息集后,立即提交offset,在這部分消息集處理,可能會發(fā)生異常,這就導(dǎo)致部分消息丟失。
2)位移提交的動作是在消費(fèi)完所有拉取到的消息之后才執(zhí)行的,中間可能發(fā)生異常,恢復(fù)后重新重新拉取,可能會導(dǎo)致重復(fù)消費(fèi)
3. KafkaConsumer是非線程安全的,那么怎么樣實現(xiàn)多線程消費(fèi)?
答案:
1)在每個線程中新建一個KafkaConsumer
2)單線程創(chuàng)建KafkaConsumer,多個處理線程處理消息(難點(diǎn)在于是否要考慮消息順序性,offset的提交方式)
4. 當(dāng)你使用kafka-topics.sh創(chuàng)建(刪除)了一個topic
答案:
創(chuàng)建:
1)會在zookeeper中的/brokers/topics節(jié)點(diǎn)下創(chuàng)建一個新的topic節(jié)點(diǎn),如:/brokers/topics/first
2)觸發(fā)Controller的監(jiān)聽程序
3)kafka Controller 負(fù)責(zé)topic的創(chuàng)建工作,并更新metadata cache
刪除:
調(diào)用腳本刪除topic會在zk上將topic設(shè)置待刪除標(biāo)志,kafka后臺有定時的線程會掃描所有需要刪除的topic進(jìn)行刪除
5. topic的分區(qū)數(shù),增減問題
答案:分區(qū)只能增加,不能減少(若是減少分區(qū)需要考慮的問題太多,事物性問題,順序性問題,時間戳問題,但是收益太小),副本可以減少
6. 內(nèi)部topic
_consumeroffsets:作用是保存 Kafka 消費(fèi)者的位移信息,logCleaner線程來完成清除無用的提交(沒有消息消費(fèi)了,默認(rèn)5s一直在提交);
_transactionstate:用來存儲事務(wù)日志消息
7. 優(yōu)先副本選舉
答案:解決當(dāng)某個主機(jī)down機(jī)后,部分主機(jī)會有多個leader 副本,導(dǎo)致負(fù)載不均衡,優(yōu)先副本選舉就是解決此問題,生產(chǎn)上不建議開啟,可以手動控制。
8. 副本怎么同步?
答案:所謂同步,必須滿足兩個條件:
副本節(jié)點(diǎn)必須能與zookeeper保持會話(心跳機(jī)制)
副本能復(fù)制leader上的所有寫操作,并且不能落后太多(卡主或滯后的副本控制由replica.lag.time.max.ms配置)
利用HW,LEO進(jìn)行復(fù)制同步。
9. 如果我指定了一個offset,Kafka怎么查找到對應(yīng)的消息?
答案:
1)跳躍表找到分段文件
2)利用稀疏索引(.index),通過二分法定位到相鄰的offset
3)接著在segment順序查找
更多關(guān)于大數(shù)據(jù)培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項目實操的話可以點(diǎn)擊咨詢課程顧問,獲取試聽資格來試聽我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。