分享一波Kafka面试题答案
之前已經分享了好幾篇關于 Kafka 的文章,從基本概念和使用到高可用機制解析到最佳實踐。今天分享幾個?Kafka?的面試題,這些面試題是大數據工程師在面試中經常問到的一些問題,在此整理一下,分享給大家。
如果你是 Java 開發工程師,也可以看看這份面試題目:假如我是面試官,我會這樣虐你
1 什么是kafka
Kafka是分布式發布-訂閱消息系統,它最初是由LinkedIn公司開發的,之后成為Apache項目的一部分,Kafka是一個分布式,可劃分的,冗余備份的持久性的日志服務,它主要用于處理流式數據。
2 為什么要使用 kafka,為什么要使用消息隊列
緩沖和削峰:上游數據時有突發流量,下游可能扛不住,或者下游沒有足夠多的機器來保證冗余,kafka在中間可以起到一個緩沖的作用,把消息暫存在kafka中,下游服務就可以按照自己的節奏進行慢慢處理。
解耦和擴展性:項目開始的時候,并不能確定具體需求。消息隊列可以作為一個接口層,解耦重要的業務流程。只需要遵守約定,針對數據編程即可獲取擴展能力。
冗余:可以采用一對多的方式,一個生產者發布消息,可以被多個訂閱topic的服務消費到,供多個毫無關聯的業務使用。
健壯性:消息隊列可以堆積請求,所以消費端業務即使短時間死掉,也不會影響主要業務的正常進行。
異步通信:很多時候,用戶不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但并不立即處理它。想向隊列中放入多少消息就放多少,然后在需要的時候再去處理它們。
3 kafka中的broker 是干什么的
broker 是消息的代理,Producers往Brokers里面的指定Topic中寫消息,Consumers從Brokers里面拉取指定Topic的消息,然后進行業務處理,broker在中間起到一個代理保存消息的中轉站。
4 kafka中的 zookeeper 起到什么作用,可以不用zookeeper么
zookeeper 是一個分布式的協調組件,早期版本的kafka用zk做meta信息存儲,consumer的消費狀態,group的管理以及 offset的值。考慮到zk本身的一些因素以及整個架構較大概率存在單點問題,新版本中逐漸弱化了zookeeper的作用。新的consumer使用了kafka內部的group coordination協議,也減少了對zookeeper的依賴,
但是broker依然依賴于ZK,zookeeper 在kafka中還用來選舉controller 和 檢測broker是否存活等等。
5 kafka follower如何與leader同步數據
Kafka的復制機制既不是完全的同步復制,也不是單純的異步復制。完全同步復制要求All Alive Follower都復制完,這條消息才會被認為commit,這種復制方式極大的影響了吞吐率。而異步復制方式下,Follower異步的從Leader復制數據,數據只要被Leader寫入log就被認為已經commit,這種情況下,如果leader掛掉,會丟失數據,kafka使用ISR的方式很好的均衡了確保數據不丟失以及吞吐率。Follower可以批量的從Leader復制數據,而且Leader充分利用磁盤順序讀以及send file(zero copy)機制,這樣極大的提高復制性能,內部批量寫磁盤,大幅減少了Follower與Leader的消息量差。
6??什么情況下一個 broker 會從 isr中踢出去
leader會維護一個與其基本保持同步的Replica列表,該列表稱為ISR(in-sync Replica),每個Partition都會有一個ISR,而且是由leader動態維護 ,如果一個follower比一個leader落后太多,或者超過一定時間未發起數據復制請求,則leader將其重ISR中移除 ,詳細參考?kafka的高可用機制
7 kafka 為什么那么快
-
Cache?Filesystem Cache PageCache緩存
-
順序寫?由于現代的操作系統提供了預讀和寫技術,磁盤的順序寫大多數情況下比隨機寫內存還要快。
-
Zero-copy?零拷?技術減少拷貝次數
-
Batching of Messages?批量量處理。合并小的請求,然后以流的方式進行交互,直頂網絡上限。
-
Pull 拉模式?使用拉模式進行消息的獲取消費,與消費端處理能力相符。
8??kafka producer如何優化打入速度
-
增加線程
-
提高 batch.size
-
增加更多 producer 實例
-
增加 partition 數
-
設置 acks=-1 時,如果延遲增大:可以增大 num.replica.fetchers(follower 同步數據的線程數)來調解;
-
跨數據中心的傳輸:增加 socket 緩沖區設置以及 OS tcp 緩沖區設置。
優化方面的參考?kafka最佳實踐
9 ?kafka producer 打數據,ack ?為 0, 1, -1 的時候代表啥, 設置 -1 的時候,什么情況下,leader 會認為一條消息 commit了
1(默認)??數據發送到Kafka后,經過leader成功接收消息的的確認,就算是發送成功了。在這種情況下,如果leader宕機了,則會丟失數據。
0?生產者將數據發送出去就不管了,不去等待任何返回。這種情況下數據傳輸效率最高,但是數據可靠性確是最低的。
-1?producer需要等待ISR中的所有follower都確認接收到數據后才算一次發送完成,可靠性最高。
當ISR中所有Replica都向Leader發送ACK時,leader才commit,這時候producer才能認為一個請求中的消息都commit了。
10 ?kafka ?unclean 配置代表啥,會對 spark streaming 消費有什么影響
unclean.leader.election.enable 為true的話,意味著非ISR集合的broker 也可以參與選舉,這樣有可能就會丟數據,spark streaming在消費過程中拿到的 end offset 會突然變小,導致 spark streaming job掛掉。如果unclean.leader.election.enable參數設置為true,就有可能發生數據丟失和數據不一致的情況,Kafka的可靠性就會降低;而如果unclean.leader.election.enable參數設置為false,Kafka的可用性就會降低。
11 如果leader crash時,ISR為空怎么辦
kafka在Broker端提供了一個配置參數:unclean.leader.election,這個參數有兩個值:
true(默認):允許不同步副本成為leader,由于不同步副本的消息較為滯后,此時成為leader,可能會出現消息不一致的情況。
false:不允許不同步副本成為leader,此時如果發生ISR列表為空,會一直等待舊leader恢復,降低了可用性。
12? kafka的message格式是什么樣的
一個Kafka的Message由一個固定長度的header和一個變長的消息體body組成
header部分由一個字節的magic(文件格式)和四個字節的CRC32(用于判斷body消息體是否正常)構成。
當magic的值為1的時候,會在magic和crc32之間多一個字節的數據:attributes(保存一些相關屬性,
比如是否壓縮、壓縮格式等等);如果magic的值為0,那么不存在attributes屬性
body是由N個字節構成的一個消息體,包含了具體的key/value消息
13? kafka中consumer group 是什么概念
同樣是邏輯上的概念,是Kafka實現單播和廣播兩種消息模型的手段。同一個topic的數據,會廣播給不同的group;同一個group中的worker,只有一個worker能拿到這個數據。換句話說,對于同一個topic,每個group都可以拿到同樣的所有數據,但是數據進入group后只能被其中的一個worker消費。group內的worker可以使用多線程或多進程來實現,也可以將進程分散在多臺機器上,worker的數量通常不超過partition的數量,且二者最好保持整數倍關系,因為Kafka在設計時假定了一個partition只能被一個worker消費(同一group內)。
總結
以上是生活随笔為你收集整理的分享一波Kafka面试题答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试|图解kafka的高可用机制
- 下一篇: 「面试题」介绍你做过最复杂的系统