kafka 怎么保證的exactly once


Kafka auto.offset.reset值詳解

發表於2017/7/6 11:25:22  1010人閱讀

分類: Kafka

昨天在寫一個java消費kafka數據的實例,明明設置auto.offset.reset為earliest,但還是不從頭開始消費,官網給出的含義太抽象了。 
earliest: automatically reset the offset to the earliest offset,自動將偏移量置為最早的。難道不是topic中各分區的開始?結果還真不是,具體含義如下:

auto.offset.reset值含義解釋

earliest 
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,從頭開始消費 
latest 
當各分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,消費新產生的該分區下的數據 
none 
topic各分區都存在已提交的offset時,從offset后開始消費;只要有一個分區不存在已提交的offset,則拋出異常

 

以下為測試詳細:

1.同分組下測試

1.1測試一

1.1.1測試環境

Topic為lsztopic7,並生產30條信息。lsztopic7詳情: 
這里寫圖片描述 
創建組為“testtopi7”的consumer,將enable.auto.commit設置為false,不提交offset。依次更改auto.offset.reset的值。此時查看offset情況為: 
這里寫圖片描述

1.1.2測試結果

earliest 
客戶端讀取30條信息,且各分區的offset從0開始消費。 
latest 
客戶端讀取0條信息。 
none 
拋出NoOffsetForPartitionException異常。 
這里寫圖片描述

1.1.3測試結論

新建一個同組名的消費者時,auto.offset.reset值含義: 
earliest 每個分區是從頭開始消費的。 
none 沒有為消費者組找到先前的offset值時,拋出異常

1.2測試二

1.2.1測試環境

測試場景一下latest時未接受到數據,保證該消費者在啟動狀態,使用生產者繼續生產10條數據,總數據為40條。 
這里寫圖片描述

1.2.2測試結果

latest 
客戶端取到了后生產的10條數據

1.2.3測試結論

當創建一個新分組的消費者時,auto.offset.reset值為latest時,表示消費新的數據(從consumer創建開始,后生產的數據),之前產生的數據不消費。

1.3測試三

1.3.1測試環境

在測試環境二,總數為40條,無消費情況下,消費一批數據。運行消費者消費程序后,取到5條數據。 
即,總數為40條,已消費5條,剩余35條。 
這里寫圖片描述

1.3.2測試結果

earliest 
消費35條數據,即將剩余的全部數據消費完。

latest 
消費9條數據,都是分區3的值。 
offset:0 partition:3 
offset:1 partition:3 
offset:2 partition:3 
offset:3 partition:3 
offset:4 partition:3 
offset:5 partition:3 
offset:6 partition:3 
offset:7 partition:3 
offset:8 partition:3

none 
拋出NoOffsetForPartitionException異常。 
這里寫圖片描述

1.3.3測試結論

earliest 當分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,從頭開始消費。 
latest 當分區下有已提交的offset時,從提交的offset開始消費;無提交的offset時,消費新產生的該分區下的數據。 
none 當該topic下所有分區中存在未提交的offset時,拋出異常。

1.4測試四

1.4.1測試環境

再測試三的基礎上,將數據消費完,再生產10條數據,確保每個分區上都有已提交的offset。 
此時,總數為50,已消費40,剩余10條 
這里寫圖片描述

1.4.2測試結果

none 
消費10條信息,且各分區都是從offset開始消費 
offset:9 partition:3 
offset:10 partition:3 
offset:11 partition:3 
offset:15 partition:0 
offset:16 partition:0 
offset:17 partition:0 
offset:18 partition:0 
offset:19 partition:0 
offset:20 partition:0 
offset:5 partition:2

1.4.3測試結論

值為none時,topic各分區都存在已提交的offset時,從offset后開始消費;只要有一個分區不存在已提交的offset,則拋出異常。

2.不同分組下測試

2.1測試五

2.1.1測試環境

在測試四環境的基礎上:總數為50,已消費40,剩余10條,創建不同組的消費者,組名為testother7 
這里寫圖片描述

2.1.2 測試結果

earliest 
消費50條數據,即將全部數據消費完。

latest 
消費0條數據。

none 
拋出異常 
這里寫圖片描述

2.1.3測試結論

組與組間的消費者是沒有關系的。 
topic中已有分組消費數據,新建其他分組ID的消費者時,之前分組提交的offset對新建的分組消費不起作用。

 

Kafka管理工具介紹

 

Consumer Offset Checker

  Consumer Offset Checker主要是運行kafka.tools.ConsumerOffsetChecker類,對應的腳本是kafka-consumer-offset-checker.sh,會顯示出Consumer的Group、Topic、分區ID、分區對應已經消費的Offset、logSize大小,Lag以及Owner等信息。

如果運行kafka-consumer-offset-checker.sh腳本的時候什么信息都不輸入,那么會顯示以下信息:

[iteblog@www.iteblog.com /]$ bin /kafka-consumer-offset-checker .sh
Check the offset of your consumers.
Option                                  Description                           
------                                  -----------                           
--broker-info                           Print broker info                     
--group                                 Consumer group.                       
--help                                  Print this message.                   
--retry.backoff.ms <Integer>            Retry back-off to use for failed      
                                           offset queries. (default: 3000)     
--socket.timeout.ms <Integer>           Socket timeout to use when querying   
                                           for offsets. (default: 6000)        
--topic                                 Comma-separated list of consumer      
                                           topics (all topics if absent).      
--zookeeper                             ZooKeeper connect string. (default:   
                                           localhost:2181)

我們根據提示,輸入的命令如下:

[iteblog@www.iteblog.com /]$ bin /kafka-consumer-offset-checker .sh --zookeeper www.iteblog.com:2181 --topic test --group spark --broker-info
Group           Topic      Pid Offset          logSize         Lag             Owner
spark    test       0   34666914        34674392        7478            none
spark    test       1   34670481        34678029        7548            none
spark    test       2   34670547        34678002        7455            none
spark    test       3   34664512        34671961        7449            none
spark    test       4   34680143        34687562        7419            none
spark    test       5   34672309        34679823        7514            none
spark    test       6   34674660        34682220        7560            none
BROKER INFO
2 -> www.iteblog.com:9092
5 -> www.iteblog.com:9093
4 -> www.iteblog.com:9094
7 -> www.iteblog.com:9095
1 -> www.iteblog.com:9096
3 -> www.iteblog.com:9097
6 -> www.iteblog.com:9098

 https://www.iteblog.com/archives/1605.html

 --------------------------------------------------------------------------------------------------------------------------------------

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM