天天看點

大資料面試(二):Kafka面試題

大資料面試(二):Kafka面試題

面試題 01 什麼是消息隊列?

消息隊列就是用于當兩個系統之間或者兩個子產品之間實作消息傳遞時,基于隊列機制實作資料緩存的中間件

面試題 02 消息隊列有什麼好處?

•實作解耦,将高耦合轉換為低耦合

•通過異步并發,提高性能,并實作最終一緻性

面試題03、Kafka是什麼?

•Kafka是一個基于訂閱釋出模式的高性能、高吞吐的實時消息隊列系統

面試題04、Kafka在大資料中用于什麼場景下?

•用于實時架構中,實作将實時資料采集的資料進行實時存儲,供于SparkStreaming或者Flink等工具實作實時資料消費處理

面試題05、請簡述Kafka的叢集架構

•Kafka是一個分布式主從架構叢集

–主節點:Kafka Controller:一種特殊的Broker,由ZK輔助實作從所有Broker中選舉,負責叢集管理,管理Topic及分區副本等

–從節點:Kafka Broker:負責實作Kafka叢集的資料存儲

•Kafka依賴于Zookeeper實作叢集輔助管理

–基于Zookeeper輔助選舉Controller

–基于Zookeeper存儲中繼資料

面試題 06 Kafka中消費者與消費者組的關系是什麼?

•消費者組負責訂閱Topic,消費者負責消費Topic分區的資料

•消費者組中可以包含多個消費者,多個消費者共同消費資料,增加消費并行度,提高消費性能

•消費者組的id由開發者指定,消費者的id由Kafka自動配置設定

面試題07、Kafka中Topic和Partition是什麼,如何保證Partition資料安全?

•Topic:邏輯上實作資料存儲的分類,類似于資料庫中的表概念

•Partition:Topic中用于實作分布式存儲的實體單元,一個Topic可以有多個分區

–每個分區可以存儲在不同的節點,實作分布式存儲

•保證資料安全通過副本機制:Kafka中每個分區可以建構多個副本【副本個數 <= 機器的個數】

–将一個分區的多個副本分為兩種角色

–leader副本:負責對外提供讀寫請求

–follower副本:負責與leader同步資料,如果leader故障,follower要重新選舉一個成為leader

•選舉:由Kafka Crontroller來決定誰是leader

面試題 08 Kafka中的Segment是什麼?

•Segment是對分區内部的資料進行更細的劃分,分區段,檔案段

•規則:按照檔案産生的時間或者大小

•目的:提高寫入和查詢性能

–檔案名稱可以用于檢索資料:用offset命名的

•組成:每個Segment由兩個檔案組成

–.log:存儲的資料

–.index:對應.log檔案的索引資訊

面試題09、Kafka中的Offset是什麼?

•Offset是kafka中存儲資料時給每個資料做的标記或者編号

•分區級别的編号,每個分區從0開始編号

•功能:消費者根據offset來進行消費,保證順序消費以及消費資料的一次性語義

面試題10、請簡述如何使用Kafka Simple Java API 實作資料生産?描述具體的類及方法

•step1:建構生産者連接配接對象:KafkaProducer

–需要配置對象:管理配置,例如連接配接位址:Properties

•step2:KafkaProducer:send:生産資料到Kafka中

–需要建構一個生産的資料對象:ProducerRecord

–ProducerRecord(Topic,Value)

–ProducerRecord(Topic,Key,Value)

–ProducerRecord(Topic,Partition,Key,Value)

面試題 11、請簡述如何使用Kafka Simple Java API 實作資料消費?描述具體的類及方法

•step1:建構消費者連接配接對象:KafkaConsumer

–需要配置對象:管理配置,例如連接配接位址:Properties

•step2:消費者需要訂閱Topic

–KafkaConsumer:subscribe(List)

•step3:消費資料

–KafkaConsumer:poll:實作拉取消費資料

–ConsumerRecords:拉取到的所有資料集合

–ConsumerRecord:消費到的每一條資料

•topic:擷取資料中的Topic

•partition:擷取資料中的分區編号

•offset:擷取資料的offset

•key:擷取資料中的Key

•value:擷取資料中的Value

面試題12、請簡述Kafka生産資料時如何保證生産資料不丢失?

•acks機制:當接收方收到資料以後,就會傳回一個确認的ack消息

•生産者向Kafka生産資料,根據配置要求Kafka傳回ACK

–ack=0:生産者不管Kafka有沒有收到,直接發送下一條

•優點:快

•缺點:容易導緻資料丢失,機率比較高

–ack=1:生産者将資料發送給Kafka,Kafka等待這個分區leader副本寫入成功,傳回ack确認,生産者發送下一條

•優點:性能和安全上做了平衡

•缺點:依舊存在資料丢失的機率,但是機率比較小

–ack=all/-1:生産者将資料發送給Kafka,Kafka等待這個分區所有副本全部寫入,傳回ack确認,生産者發送下一條

•優點:資料安全

•缺點:慢

•如果使用ack=all,可以搭配min.insync.replicas參數一起使用,可以提高效率

–min.insync.replicas:表示最少同步幾個副本以後,就傳回ack

•如果生産者沒有收到ack,就使用重試機制,重新發送上一條消息,直到收到ack

面試題 13 請簡述Kafka生産資料時如何保證生産資料不重複?

•資料重複的場景:Kafka寫入資料,傳回ack,但是ack丢失,生産者沒有收到ack,重新寫入資料,導緻Kafka資料重複

•Kafka中使用幂等性機制來保證生産資料不重複

–step1:發送資料時,給每條資料增加一個資料id的編号,每次下一條資料的編号自增1

–step2:Kafka将資料寫入,并記住寫入的資料id

–step3:如果下一條資料的id與上一次的資料id一緻,就不寫入,直接傳回ack

面試題14、Kafka中生産者的資料分區規則是什麼,如何自定義分區規則?

•如果指定了分區:就寫入指定的分區

•如果沒有指定分區,就判斷是否指定了Key

–如果指定了Key:根據Key的Hash取餘分區

–如果沒有指定Key:根據黏性分區來實作

•自定義分區

–開發一個類實作Partitioner接口

–實作partition方法

–在生産者中指定分區器的配置

面試題15、Kafka中消費者消費資料的規則是什麼?

•消費者根據Offset對Topic中的分區進行消費

•第一次消費:根據auto.offset.reset屬性進行消費

–latest:從最新的位置開始消費

–earliest:從頭開始消費

•第二次消費:根據上一次的offset+1繼續消費

面試題 16、為什麼要設計Segment?

•加快查詢效率:将資料劃分到多個小檔案中,通過offset比對可以定位某個檔案,從小資料量中找到需要的資料

•提高删除性能:以Segment為機關進行删除,避免以每一條資料進行删除,影響性能

面試題17、什麼是AR、ISR、OSR?

•AR:all replicas

–所有副本 = ISR + OSR

•ISR:In-sync-replicas

–表示正在同步的副本 =》 可用副本分區

–如果Leader故障,會從ISR中選舉一個新的leader

•OSR:Out-sync-replicas

–表示不健康的副本 =》 不可用副本

–判斷依據

#如果這個從副本在這個時間内沒有與leader副本同步資料,認為這個副本是不正常的

參數設定: replica.lag.time.max.ms = 10000

面試題 18、什麼是HW、LEO?

•HW:表示目前leader副本中所有Follower都已經同步的位置 + 1,高水位線

•LEO:表示目前leader副本最新的資料位置 + 1

•消費者能消費到的位置是HW:為了保證消費者消費分區資料的統一性

面試題19、什麼是一次性語義?

•at-most-once:最多一次

•at-least-once:至少一次

•exactly-once:有且僅有一次

面試題20、Kafka如何保證消費者消費資料不重複不丢失?

•Kafka消費者通過Offset實作資料消費,隻要保證各種場景下能正常實作Offset的記錄即可

•保證消費資料不重複需要每次消費處理完成以後,将Offset存儲在外部存儲中,例如MySQL、Zookeeper、Redis中

•保證以消費分區、處理分區、記錄分區的offset的順序實作消費處理

•如果故障重新開機,隻要從外部系統中讀取上一次的Offset繼續消費即可

侵删 轉自 https://manor.blog.csdn.net/