kafka重置偏移量

黑色与褐色發表於2024-03-22

背景

某些時候,kafka上游生產者生產的訊息有錯誤,或者下游消費者並不需要消費某部分的資料,這時候,通常有兩個解決方案,一種是對資料做不解析處理,直接略過。另一種就是暫時關掉kafka的消費者組,等到生產者正常後再進行消費,但由於kafka本身是預設斷點續傳的,此時就需要我們先重置kafka中當前kafka組的offset。

解決方案

更改消費者組

由於kafka對某topic中offset的管理是以組的形式來進行的,因此,在新建或更改消費者組後,對於offset的管理也會重新開始,策略取決於配置的auto.offset.reset引數

在重啟動時指定起始offset

在再次啟動時,透過配置指定要消費topic中分割槽的offset
@KafkaListener(groupId = "topic_group_test",topicPartitions = { @TopicPartition(topic = "topic_test",partitionOffsets = @PartitionOffset(partition = "0", initialOffset = "9830")) })
java springboot版本

透過kafka服務端指令碼指定重置

kafka-consumer-groups.sh --bootstrap-server 10.202.13.27:9092 \ --group cjw --reset-offsets --topic cjw-test --to-earliest --execute
具體支援8種操作
--to-earliest
--to-latest
--to-current
--to-offset
--shift-by N: 把位移調整到當前位移+N 處,N可以為負數
--to-datetime : 把位移調整到大於給定時間的最早位移處,datetime格式yyyy-MM-ddTHH:mm:ss.xxx
--by-duration:把位移調整到距離當前時間指定間隔的位移處,格式為PnDTnHnMnS
--from-file:從CSV檔案中讀取調整策略

透過API程式碼來指定

consumer.seekToEnd( consumer.partitionsFor(topic).stream().map(partitionInfo-> new TopicPartition(topic,partitionInfo.partition())) .collect(Collectors.toList()) );
void seek(TopicPartition partition, long offset);
Void seek(TopicPartition partition,OffsetAndMetadata offsetAndMetadata);
Void seekToBeginning(Collection partitions)
Void seekToEnd(Collection partitions)

注意

以上所有操作都需要在消費者組處於未啟用的情況下進行
使用程式碼方式時,需要指定所有分割槽的消費策略

相關文章