1、請說明什么是Apache Kafka?
Apache Kafka是由Apache開發的一種發布訂閱消息系統,它是一個分布式的、分區的和可復制的提交日志服務。
2、說說Kafka的使用場景?
①異步處理
②應用解耦
③流量削峰
④日志處理
⑤消息通訊等。
3、使用Kafka有什么優點和缺點?
優點:
①支持跨數據中心的消息復制;
②單機吞吐量:十萬級,最大的優點,就是吞吐量高;
③topic數量都吞吐量的影響:topic從幾十個到幾百個的時候,吞吐量會大幅度下降。所以在同等機器下,kafka盡量保證topic數量不要過多。如果要支撐大規模topic,需要增加更多的機器資源;
④時效性:ms級;
⑤可用性:非常高,kafka是分布式的,一個數據多個副本,少數機器宕機,不會丟失數據,不會導致不可用;
⑥消息可靠性:經過參數優化配置,消息可以做到0丟失;
⑦功能支持:功能較為簡單,主要支持簡單的MQ功能,在大數據領域的實時計算以及日志采集被大規模使用。
缺點:
①由於是批量發送,數據並非真正的實時; 僅支持統一分區內消息有序,無法實現全局消息有序;
②有可能消息重復消費;
③依賴zookeeper進行元數據管理,等等。
4、為什么說Kafka性能很好,體現在哪里?
①順序讀寫
②零拷貝
③分區
④批量發送
⑤數據壓縮
5、請說明什么是傳統的消息傳遞方法?
傳統的消息傳遞方法包括兩種:
排隊:在隊列中,一組用戶可以從服務器中讀取消息,每條消息都發送給其中一個人。
發布-訂閱:在這個模型中,消息被廣播給所有的用戶。
6、請說明Kafka相對傳統技術有什么優勢?
①快速:單一的Kafka代理可以處理成千上萬的客戶端,每秒處理數兆字節的讀寫操作。
②可伸縮:在一組機器上對數據進行分區
③和簡化,以支持更大的數據
④持久:消息是持久性的,並在集群中進
⑤行復制,以防止數據丟失。
⑥設計:它提供了容錯保證和持久性
7、解釋Kafka的Zookeeper是什么?我們可以在沒有Zookeeper的情況下使用Kafka嗎?
Zookeeper是一個開放源碼的、高性能的協調服務,它用於Kafka的分布式應用。
不,不可能越過Zookeeper,直接聯系Kafka broker。一旦Zookeeper停止工作,它就不能服務客戶端請求。
Zookeeper主要用於在集群中不同節點之間進行通信
在Kafka中,它被用於提交偏移量,因此如果節點在任何情況下都失敗了,它都可以從之前提交的偏移量中獲取
除此之外,它還執行其他活動,如: leader檢測、分布式同步、配置管理、識別新節點何時離開或連接、集群、節點實時狀態等等。
8、解釋Kafka的用戶如何消費信息?
在Kafka中傳遞消息是通過使用sendfile API完成的。它支持將字節從套接口轉移到磁盤,通過內核空間保存副本,並在內核用戶之間調用內核。
9、解釋如何提高遠程用戶的吞吐量?
如果用戶位於與broker不同的數據中心,則可能需要調優套接口緩沖區大小,以對長網絡延遲進行攤銷。
10、解釋一下,在數據制作過程中,你如何能從Kafka得到准確的信息?
在數據中,為了精確地獲得Kafka的消息,你必須遵循兩件事: 在數據消耗期間避免重復,在數據生產過程中避免重復。
這里有兩種方法,可以在數據生成時准確地獲得一個語義:
每個分區使用一個單獨的寫入器,每當你發現一個網絡錯誤,檢查該分區中的最后一條消息,以查看您的最后一次寫入是否成功
在消息中包含一個主鍵(UUID或其他),並在用戶中進行反復制
11、解釋如何減少ISR中的擾動?broker什么時候離開ISR?
ISR是一組與leaders完全同步的消息副本,也就是說ISR中包含了所有提交的消息。ISR應該總是包含所有的副本,直到出現真正的故障。如果一個副本從leader中脫離出來,將會從ISR中刪除。
12、Kafka為什么需要復制?
Kafka的信息復制確保了任何已發布的消息不會丟失,並且可以在機器錯誤、程序錯誤或更常見些的軟件升級中使用。
13、如果副本在ISR中停留了很長時間表明什么?
如果一個副本在ISR中保留了很長一段時間,那么它就表明,跟蹤器無法像在leader收集數據那樣快速地獲取數據。
14、請說明如果首選的副本不在ISR中會發生什么?
如果首選的副本不在ISR中,控制器將無法將leadership轉移到首選的副本。
15、有可能在生產后發生消息偏移嗎?
在大多數隊列系統中,作為生產者的類無法做到這一點,它的作用是觸發並忘記消息。broker將完成剩下的工作,比如使用id進行適當的元數據處理、偏移量等。
作為消息的用戶,你可以從Kafka broker中獲得補償。如果你注視SimpleConsumer類,你會注意到它會獲取包括偏移量作為列表的MultiFetchResponse對象。此外,當你對Kafka消息進行迭代時,你會擁有包括偏移量和消息發送的MessageAndOffset對象。
16、Kafka的設計時什么樣的呢?
Kafka將消息以topic為單位進行歸納 將向Kafka topic發布消息的程序成為producers. 將預訂topics並消費消息的程序成為consumer. Kafka以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個broker. producers通過網絡將消息發送到Kafka集群,集群向消費者提供消息
17、數據傳輸的事物定義有哪三種?
(1)最多一次:
消息不會被重復發送,最多被傳輸一次,但也有可能一次不傳輸
(2)最少一次: 消息不會被漏發送,最少被傳輸一次,但也有可能被重復傳輸.
(3)精確的一次(Exactly once): 不會漏傳輸也不會重復傳輸,每個消息都傳輸被一次而且僅僅被傳輸一次,這是大家所期望的
18、Kafka判斷一個節點是否還活着有那兩個條件?
(1)節點必須可以維護和ZooKeeper的連接,Zookeeper通過心跳機制檢查每個節點的連接
(2)如果節點是個follower,他必須能及時的同步leader的寫操作,延時不能太久
19、producer是否直接將數據發送到broker的leader(主節點)?
producer直接將數據發送到broker的leader(主節點),不需要在多個節點進行分發,為了幫助producer做到這點,所有的Kafka節點都可以及時的告知:哪些節點是活動的,目標topic目標分區的leader在哪。這樣producer就可以直接將消息發送到目的地了。
20、Kafa consumer是否可以消費指定分區消息?
Kafa consumer消費消息時,向broker發出"fetch"請求去消費特定分區的消息,consumer指定消息在日志中的偏移量(offset),就可以消費從這個位置開始的消息,customer擁有了offset的控制權,可以向后回滾去重新消費之前的消息,這是很有意義的
21、Kafka消息是采用Pull模式,還是Push模式?
Kafka最初考慮的問題是,customer應該從brokes拉取消息還是brokers將消息推送到consumer,也就是pull還push。在這方面,Kafka遵循了一種大部分消息系統共同的傳統的設計:producer將消息推送到broker,consumer從broker拉取消息一些消息系統比如Scribe和Apache Flume采用了push模式,將消息推送到下游的consumer。這樣做有好處也有壞處:由broker決定消息推送的速率,對於不同消費速率的consumer就不太好處理了。消息系統都致力於讓consumer以最大的速率最快速的消費消息,但不幸的是,push模式下,當broker推送的速率遠大於consumer消費的速率時,consumer恐怕就要崩潰了。最終Kafka還是選取了傳統的pull模式
Pull模式的另外一個好處是consumer可以自主決定是否批量的從broker拉取數據。Push模式必須在不知道下游consumer消費能力和消費策略的情況下決定是立即推送每條消息還是緩存之后批量推送。如果為了避免consumer崩潰而采用較低的推送速率,將可能導致一次只推送較少的消息而造成浪費。Pull模式下,consumer就可以根據自己的消費能力去決定這些策略
Pull有個缺點是,如果broker沒有可供消費的消息,將導致consumer不斷在循環中輪詢,直到新消息到t達。為了避免這點,Kafka有個參數可以讓consumer阻塞知道新消息到達(當然也可以阻塞知道消息的數量達到某個特定的量這樣就可以批量發
22、Kafka存儲在硬盤上的消息格式是什么?
消息由一個固定長度的頭部和可變長度的字節數組組成。頭部包含了一個版本號和CRC32校驗碼。
消息長度: 4 bytes (value: 1+4+n)
版本號: 1 byte
CRC校驗碼: 4 bytes
具體的消息: n bytes
23、Kafka高效文件存儲設計特點:
(1).Kafka把topic中一個parition大文件分成多個小文件段,通過多個小文件段,就容易定期清除或刪除已經消費完文件,減少磁盤占用。
(2).通過索引信息可以快速定位message和確定response的最大大小。
(3).通過index元數據全部映射到memory,可以避免segment file的IO磁盤操作。
(4).通過索引文件稀疏存儲,可以大幅降低index文件元數據占用空間大小。
24、Kafka 與傳統消息系統之間有三個關鍵區別
(1).Kafka 持久化日志,這些日志可以被重復讀取和無限期保留
(2).Kafka 是一個分布式系統:它以集群的方式運行,可以靈活伸縮,在內部通過復制數據提升容錯能力和高可用性
(3).Kafka 支持實時的流式處理
25、Kafka創建Topic時如何將分區放置到不同的Broker中
副本因子不能大於 Broker 的個數;
第一個分區(編號為0)的第一個副本放置位置是隨機從 brokerList 選擇的;
其他分區的第一個副本放置位置相對於第0個分區依次往后移。也就是如果我們有5個 Broker,5個分區,假設第一個分區放在第四個 Broker 上,那么第二個分區將會放在第五個 Broker 上;第三個分區將會放在第一個 Broker 上;第四個分區將會放在第二個 Broker 上,依次類推;
剩余的副本相對於第一個副本放置位置其實是由 nextReplicaShift 決定的,而這個數也是隨機產生的
26、Kafka新建的分區會在哪個目錄下創建
在啟動 Kafka 集群之前,我們需要配置好 log.dirs 參數,其值是 Kafka 數據的存放目錄,這個參數可以配置多個目錄,目錄之間使用逗號分隔,通常這些目錄是分布在不同的磁盤上用於提高讀寫性能。 當然我們也可以配置 log.dir 參數,含義一樣。只需要設置其中一個即可。 如果 log.dirs 參數只配置了一個目錄,那么分配到各個 Broker 上的分區肯定只能在這個目錄下創建文件夾用於存放數據。 但是如果 log.dirs 參數配置了多個目錄,那么 Kafka 會在哪個文件夾中創建分區目錄呢?答案是:Kafka 會在含有分區目錄最少的文件夾中創建新的分區目錄,分區目錄名為 Topic名+分區ID。注意,是分區文件夾總數最少的目錄,而不是磁盤使用量最少的目錄!也就是說,如果你給 log.dirs 參數新增了一個新的磁盤,新的分區目錄肯定是先在這個新的磁盤上創建直到這個新的磁盤目錄擁有的分區目錄不是最少為止。
27、partition的數據如何保存到硬盤
topic中的多個partition以文件夾的形式保存到broker,每個分區序號從0遞增, 且消息有序 Partition文件下有多個segment(xxx.index,xxx.log) segment 文件里的 大小和配置文件大小一致可以根據要求修改 默認為1g 如果大小大於1g時,會滾動一個新的segment並且以上一個segment最后一條消息的偏移量命名
28、kafka的ack機制
request.required.acks有三個值 0 1 -1
0:生產者不會等待broker的ack,這個延遲最低但是存儲的保證最弱當server掛掉的時候就會丟數據
1:服務端會等待ack值 leader副本確認接收到消息后發送ack但是如果leader掛掉后他不確保是否復制完成新leader也會導致數據丟失
-1:同樣在1的基礎上 服務端會等所有的follower的副本受到數據后才會受到leader發出的ack,這樣數據不會丟失
29、Kafka的消費者如何消費數據
消費者每次消費數據的時候,消費者都會記錄消費的物理偏移量(offset)的位置 等到下次消費時,他會接着上次位置繼續消費。同時也可以按照指定的offset進行重新消費。
30、消費者負載均衡策略
結合consumer的加入和退出進行再平衡策略。
31、kafka消息數據是否有序?
消費者組里某具體分區是有序的,所以要保證有序只能建一個分區,但是實際這樣會存在性能問題,具體業務具體分析后確認。
32、kafaka生產數據時數據的分組策略,生產者決定數據產生到集群的哪個partition中
每一條消息都是以(key,value)格式 Key是由生產者發送數據傳入 所以生產者(key)決定了數據產生到集群的哪個partition
33、kafka consumer 什么情況會觸發再平衡reblance?
①一旦消費者加入或退出消費組,導致消費組成員列表發生變化,消費組中的所有消費者都要執行再平衡。
②訂閱主題分區發生變化,所有消費者也都要再平衡。
34、描述下kafka consumer 再平衡步驟?
①關閉數據拉取線程,情空隊列和消息流,提交偏移量;
②釋放分區所有權,刪除zk中分區和消費者的所有者關系;
③將所有分區重新分配給每個消費者,每個消費者都會分到不同分區;
④將分區對應的消費者所有關系寫入ZK,記錄分區的所有權信息;
⑤重啟消費者拉取線程管理器,管理每個分區的拉取線程。
以上Kafka面試題部分來自網絡,答案僅供參考,如果有不同的看法可以留言討論。死記硬背的方式不建議。如果您最近有面試到關於Kafka的面試題,歡迎留言分享哦~
下面這份是我找到的另一篇Kafka面試資料,有需要的話點贊+關注,私信我就能獲取啦!