解惑 | 爲何我根據時間戳得到的offset爲空呢?

 

每個成功人士的背後,一定曾經作出過勇敢而又孤獨的決定。java

放棄不難,但堅持很酷~git

kafka_2.11-1.1.0github

1、前言

最近有一個需求,要查詢某一時間戳對應的offset值,因而就想到了使用 ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --time <timestamp> ,可是我在測試的時候,發現有的時間戳會獲取不到offset,是空。可是明明指定的時間戳有上報數據,確定有對應的 offset 的。因而就谷歌,找到了這篇帖子:spring

https://stackoverflow.com/questions/30030393/strange-behavior-of-kafka-tool-kafka-tools-getoffsetshellshell

其中已經有大佬給出了答案,可是我仍是不求甚解,但起碼知道了和 kafka log segments 有關係。api

通過研究實踐,明白了其中原因,因此就有了這篇文章。微信

2、解惑

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list message-1:9092 -topic test --time 後面的參數能夠是 -一、-二、時間戳,其中 -1 會輸出最新的 offset ;-2 會輸出未過時最小的 offset ;時間戳這裏具備迷惑性,它不能根據時間戳獲取到精準匹配的 offset 。框架

Kafka 將數據存儲在 「log segments」 裏面,log segments 文件的大小受 log.segment.bytes 影響,默認爲 1073741824 字節,也就是 1G 。當數據文件累積到 log.segment.bytes 的值之後,就會建立出新的日誌文件,文件名稱以分段時的那個 offset 命名,以下圖所示:函數

每個 xxx.log 文件都算做一個 segment,kafka.tools.GetOffsetShell --time 參數匹配的是 xxx.log 文件自己最後的修改時間,而不是偏移量自己的時間戳。spring-boot

根據上面圖片,舉幾個例子:

  • 當 time 爲 2020-09-16 11:59:20 時,獲取的 offset 值爲空。

  • 當 time 大於等於 2020-09-16 12:00:20 而且 time 小於 2020-09-16 14:09:24 時,獲取的 offset 值爲 0,匹配的是 xxx.log 文件名稱的那個 offset 。

  • 當 time 大於等於 2020-09-16 14:09:24 時,獲取的 offset 值爲 1049942,匹配的是 xxx.log 文件名稱的那個 offset 。

  • 當 time 遠大於 2020-09-16 14:09:24 時,獲取的 offset 值爲最新的 offset 值。

根據以上實踐結果得知,一組時間戳均對應着同一個 offset 。因此這個命令 --time <timestamp> 只能匹配個大概的 offset 而已,沒法精確。若是精確,能夠調用 java api 來封裝成接口或工具使用。

3、調用 kafka java api 獲取時間戳對應的 offset,並封裝成工具腳本

很納悶,爲何官方不提供獲取時間戳對應的精準的 offset 呢?既然官網沒有,那我就用 java api 封裝一個工具腳本吧。

先展現下效果:

./bin/getoffsetts --broker-list message-1:9092 --topic hiacloud-ts-v3 --time 1600222353353

腳本選項:

其實上面的 getoffsetts 腳本是執行的一個 java 類,java main() 方法。利用了 JCommander 。JCommander 是一個用於解析命令行參數的 Java 框架,利用 @Parameter 來接收命令參數。

在 main() 函數裏面,建立 JCommander 對象,將 args 加載進去,

而後使用 consumer.offsetsForTimes(Map timestampsToSearch) 來經過時間戳獲取各分區對應的 offset 。

具體的代碼已經上傳到了 

https://github.com/841809077/spring-boot-model/blob/master/src/main/java/com/example/main/OffsetTimestamp.java 

能夠直接粘貼到本身的項目中使用這個類查詢 offset 。

這個項目算是一個快速可複用項目,支持自定義打包、統一異常處理等,感興趣的能夠下載下來看看。

 

 

歡迎你們留言討論

👆 👆 👆

 

往期推薦

兩種實現方式 | 如何查看消費者組的消費狀況

Kafka消費者 之 指定位移消費

Kafka消費者 之 如何訂閱主題或分區

Kafka消費者 之 如何進行消息消費

Kafka消費者 之 如何提交消息的偏移量

Kafka基礎(二):生產者相關知識彙總

Kafka基礎(一):基本概念及生產者、消費者示例

 

掃一掃,咱們的故事就開始了。

若是這篇文章對你有所啓發,點贊、轉發都是一種支持!

讓我知道你在看

本文分享自微信公衆號 - 大數據實戰演練(gh_f942bfc92d26)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索