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管理工具介紹
- 1 Consumer Offset Checker
- 2 Dump Log Segment
- 3 導出Zookeeper中Group相關的偏移量
- 4 通過JMX獲取metrics信息
- 5 Kafka數據遷移工具
- 6 日志重放工具
- 7 Simple Consume腳本
- 8 更新Zookeeper中的偏移量
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
--------------------------------------------------------------------------------------------------------------------------------------