1 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指到日誌檔案的最開始位置和最近的位置。
如果進一步想控制時間,則需要呼叫******consumer,自己去設定相關引數。比較重要的引數是
kafka.api.offsetrequest.earliesttime()和kafka.api.offsetrequest.latesttime()分別表示從日誌(資料)的開始位置讀取和只讀取最新日誌。
如何使用******consumer
首先,你必須知道讀哪個topic的哪個partition
然後,找到負責該partition的broker leader,從而找到存有該partition副本的那個broker
再者,自己去寫request並fetch資料
最終,還要注意需要識別和處理brokerleader的改變
(見:
1
2
3 完整**
2 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會發生變化
(詳見:
3 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保持一致。
(2) kafka分配replica的演算法如下:
(1)將所有broker(假設共n個broker)和待分配的partition排序
(2)將第i個partition分配到第(imod n)個broker上
(3)將第i個partition的第j個replica分配到第((i + j) mode n)個broker上
(詳見:
4 kafka如何設定生存週期與清理資料
日誌檔案的刪除策略非常簡單:啟動乙個後台執行緒定期掃瞄log file列表,把儲存時間超過閥值的檔案直接刪除(根據檔案的建立時間).清理引數在server.properties檔案中:
(詳見:
或5 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連線,並獲取訊息.
6 補充問題,kafka能否自動建立topics
server.properties配置檔案中的乙個引數
##是否自動建立topic
##如果broker中沒有topic的資訊,當producer/consumer操作topic時,是否自動建立.
##如果為false,則只能通過api或者command建立topic
auto.create.topics.enable=true
SaaS 運營關鍵問題
1。強大的硬體投入。保障24小時不間斷使用者資料訪問 amazon一年故障控制在5分鐘 伺服器投資佔硬體很大比重 應用伺服器,資料庫伺服器,身份認證伺服器,儲存備份伺服器等 2。穩定性 a。saas應作為乙個運營軟體,這就要求使用者任意輸入資料都不會導致系統錯誤,否則海量使用者會造成巨大損失。如,輸...
docker 幾個關鍵問題
1.容器和映象的區別 映象 image 和容器 container 的關係,就像是物件導向程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立 啟動 停止 刪除 暫停等 2.映象和倉庫的概念 4.registry repository tag images docker...
tensorflow 關鍵問題辨析
tensorflow中name scope和variable scope的理解 之所以會出現這兩種型別的scope,主要是後者 variable scope 為了實現tensorflow中的變數共享機制 即為了使得在 的任何部分可以使用某乙個已經建立的變數,tf引入了變數共享機制,使得可以輕鬆的共享...