通過offsets.retention.minutes設定kafkaoffset的過期時間

董可倫發表於2018-07-06
版權宣告:本文由董可倫首發於https://dongkelun.com,非商業轉載請註明作者及原創出處。商業轉載請聯絡作者本人。 https://blog.csdn.net/dkl12/article/details/80943281

我的原創地址:https://dongkelun.com/2018/06/21/modifyKafkaOffsetTime/

前言

本文記錄博主如何設定kafka的offset過期時間並測試其效果

1、offsets.retention.minutes

通過修改offsets.retention.minutes的值即可改變kafka offset的過期時間,單位為分鐘,改完之後需要重啟kafka。具體的配置檔案為$KAFKA_HOME/config/server.properties,原生的kafka配置檔案裡可能沒有這個配置項,自己新增上即可,比如設定過期時間為一小時,那麼按如下配置即可

offsets.retention.minutes=60

2、官方文件

網上有的部落格說官網文件對於這個配置的說明有點錯誤,將offsets.retention.minutes錯寫成了offsets.topic.retention.minutes,但是我檢視了一下,官方文件上並沒有寫錯,可能是之前的版本寫錯了,而且很多部落格按之前的版本寫的,大家注意一下。官網文件地址http://kafka.apache.org/documentation/

3、ambari的bug

因本人用ambari管理大資料叢集的各個元件,所以在介面上直接修改kafka的配置,在介面上檢視kafka的配置offsets.retention.minutes為86400000,因為kafka offset預設過期時間為一天,那麼根據這個86400000來看offsets.retention.minutes的單位為毫秒才對,所以一開始誤認為單位為毫秒,所以修改配置後的時間設定的很大,導致一開始測試不成功,經過一點點的驗證,發現單位實際上為分鐘,而ambari上顯示的86400000應該是個bug,因為kafka預設的配置檔案裡是沒有這個配置項的,所以我估計ambari一開始也沒有配置只是搜尋的時候將其顯示為86400000,而並沒有真正的生效,只有將這個配置項修改之後,才會生效,並且單位為分鐘(看了一下ambari的大部分預設時間單位都是毫秒~)。
後來在官網上看到offsets.retention.minutes的default為1440也證實了這一點。

4、測試效果

雖然本人的需求是將預設的一天的時間改長一點,但是時間長了測試太慢,所以將時間改短一點測試效果即可,測試程式碼見Spark Streamming+Kafka提交offset實現有且僅有一次,經過多次測試,得出結論,在修改重啟之後,不管是新增加的topic還是之前的topic,只要是新儲存的offset都會生效,而之前儲存的offset,比如之前是一天才會刪除,那麼修改重啟後,之前儲存的offset還是會一天後才能刪掉。

注:spark儲存offset程式碼

stream.foreachRDD { rdd =>
  val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges

  // some time later, after outputs have completed
  stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
}

5、注意

offset的過期時間是不精確的,實際上大於等於你設定的時間,假如設定的時間為10分鐘,那麼可能在10-20之後才會刪掉,原因我想應該是kafka會定期的檢查offset被標記為應該清理的offset,可能offsets.retention.check.interval.ms這個配置項有關,因為其預設時間為十分鐘,但是沒有去驗證這一點。
* offsets.retention.check.interval.ms 600000 offset管理器檢查陳舊offsets的頻率


相關文章