1、
consumer是底層採用的是一個阻塞隊列,只要一有producer生產數據,那consumer就會將數據消費。當然這裏會產生一個很嚴重的問題,如果你重啓一消費者程序,那你連一條數據都抓不到,但是log文件中明明可以看到所有數據都好好的存在。換句話說,一旦你消費過這些數據,那你就無法再次用同一個groupid消費同一組數據了。
原因:消費者消費了數據並不從隊列中移除,只是記錄了offset偏移量。同一個consumergroup的所有consumer合起來消費一個topic,並且他們每次消費的時候都會保存一個offset參數在zookeeper的root上。如果此時某個consumer掛了或者新增一個consumer進程,將會觸發kafka的負載均衡,暫時性的重啓所有consumer,重新分配哪個consumer去消費哪個partition,然後再繼續通過保存在zookeeper上的offset參數繼續讀取數據。注意:offset保存的是consumer 組消費的消息偏移。
要消費同一組數據,你可以
- 採用不同的group。
- 通過一些配置,就可以將線上產生的數據同步到鏡像中去,然後再由特定的集羣區處理大批量的數據。
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數目關係
- 如果consumer比partition多,是浪費,因爲kafka的設計是在一個partition上是不允許併發的,所以consumer數不要大於partition數 。
- 如果consumer比partition少,一個consumer會對應於多個partitions,這裏主要合理分配consumer數和partition數,否則會導致partition裏面的數據被取的不均勻 。最好partiton數目是consumer數目的整數倍,所以partition數目很重要,比如取24,就很容易設定consumer數目 。
- 如果consumer從多個partition讀到數據,不保證數據間的順序性,kafka只保證在一個partition上數據是有序的,但多個partition,根據你讀的順序會有不同
- 增減consumer,broker,partition會導致rebalance,所以rebalance後consumer對應的partition會發生變化
4、kafka topic 副本問題
Kafka儘量將所有的Partition均勻分配到整個集羣上。一個典型的部署方式是一個Topic的Partition數量大於Broker的數量。
- 如何分配副本:
Producer在發佈消息到某個Partition時,先通過ZooKeeper找到該Partition的Leader,然後無論該Topic的Replication Factor爲多少(也即該Partition有多少個Replica),Producer只將該消息發送到該Partition的Leader。Leader會將該消息寫入其本地Log。每個Follower都從Leader pull數據。這種方式上,Follower存儲的數據順序與Leader保持一致。
- 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
- Producer端使用zookeeper用來"發現"broker列表,以及和Topic下每個partition leader建立socket連接併發送消息.
- Broker端使用zookeeper用來註冊broker信息,以及監測partition leader存活性.
- Consumer端使用zookeeper用來註冊consumer信息,其中包括consumer消費的partition列表等,同時也用來發現broker列表,並和partition leader建立socket連接,並獲取消息.