kafka常見問題如果想消費已經被消費過的數據

1

consumer是底層採用的是一個阻塞隊列,只要一有producer生產數據,那consumer就會將數據消費。當然這裏會產生一個很嚴重的問題,如果你重啓一消費者程序,那你連一條數據都抓不到,但是log文件中明明可以看到所有數據都好好的存在。換句話說,一旦你消費過這些數據,那你就無法再次用同一個groupid消費同一組數據了。

原因:消費者消費了數據並不從隊列中移除,只是記錄了offset偏移量。同一個consumergroup的所有consumer合起來消費一個topic,並且他們每次消費的時候都會保存一個offset參數在zookeeper的root上。如果此時某個consumer掛了或者新增一個consumer進程,將會觸發kafka的負載均衡,暫時性的重啓所有consumer,重新分配哪個consumer去消費哪個partition,然後再繼續通過保存在zookeeper上的offset參數繼續讀取數據。注意:offset保存的是consumer 組消費的消息偏移。

要消費同一組數據,你可以

  1. 採用不同的group。
  2. 通過一些配置,就可以將線上產生的數據同步到鏡像中去,然後再由特定的集羣區處理大批量的數據。
標題

2、如何自定義去消費已經消費過的數據

Conosumer.properties配置文件中有兩個重要參數

auto.commit.enable:如果爲true,則consumer的消費偏移offset會被記錄到zookeeper。下次consumer啓動時會從此位置繼續消費。

auto.offset.reset  該參數只接受兩個常量largest和Smallest,分別表示將當前offset指到日誌文件的最開始位置和最近的位置。

如果進一步想控制時間,則需要調用SimpleConsumer,自己去設置相關參數。比較重要的參數是 kafka.api.OffsetRequest.EarliestTime()和kafka.api.OffsetRequest.LatestTime()分別表示從日誌(數據)的開始位置讀取和只讀取最新日誌。

如何使用SimpleConsumer

首先,你必須知道讀哪個topic的哪個partition

然後,找到負責該partition的broker leader,從而找到存有該partition副本的那個broker

再者,自己去寫request並fetch數據

最終,還要注意需要識別和處理brokerleader的改變

3、kafka partition和consumer數目關係

  1. 如果consumer比partition多,是浪費,因爲kafka的設計是在一個partition上是不允許併發的,所以consumer數不要大於partition數 。
  2. 如果consumer比partition少,一個consumer會對應於多個partitions,這裏主要合理分配consumer數和partition數,否則會導致partition裏面的數據被取的不均勻 。最好partiton數目是consumer數目的整數倍,所以partition數目很重要,比如取24,就很容易設定consumer數目 。
  3. 如果consumer從多個partition讀到數據,不保證數據間的順序性,kafka只保證在一個partition上數據是有序的,但多個partition,根據你讀的順序會有不同
  4. 增減consumer,broker,partition會導致rebalance,所以rebalance後consumer對應的partition會發生變化

4、kafka topic 副本問題

Kafka儘量將所有的Partition均勻分配到整個集羣上。一個典型的部署方式是一個Topic的Partition數量大於Broker的數量。

  1. 如何分配副本:

Producer在發佈消息到某個Partition時,先通過ZooKeeper找到該Partition的Leader,然後無論該Topic的Replication Factor爲多少(也即該Partition有多少個Replica),Producer只將該消息發送到該Partition的Leader。Leader會將該消息寫入其本地Log。每個Follower都從Leader pull數據。這種方式上,Follower存儲的數據順序與Leader保持一致。

  1. Kafka分配Replica的算法如下:

將所有Broker(假設共n個Broker)和待分配的Partition排序

將第i個Partition分配到第(imod n)個Broker上

將第i個Partition的第j個Replica分配到第((i + j) mode n)個Broker上

5、kafka如何設置生存週期與清理數據

日誌文件的刪除策略非常簡單:啓動一個後臺線程定期掃描log file列表,把保存時間超過閥值的文件直接刪除(根據文件的創建時間).清理參數在server.properties文件中:

6、zookeeper如何管理kafka   

  1. Producer端使用zookeeper用來"發現"broker列表,以及和Topic下每個partition leader建立socket連接併發送消息.
  2. Broker端使用zookeeper用來註冊broker信息,以及監測partition leader存活性.
  3. Consumer端使用zookeeper用來註冊consumer信息,其中包括consumer消費的partition列表等,同時也用來發現broker列表,並和partition leader建立socket連接,並獲取消息.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章