Kafka offset管理

Kafka offset管理

消費者在消費的過程中需要記錄自己消費了多少數據,即消費 Offset。Kafka Offset 是Consumer Position,與 Broker 和 Producer 都無關。每個 Consumer Group、每個 Topic 的每個Partition 都有各自的 Offset,如下圖所示。

通常由如下幾種 Kafka Offset 的管理方式:

  • Spark Checkpoint:在 Spark Streaming 執行Checkpoint 操作時,將 Kafka Offset 一併保存到 HDFS 中。這種方式的問題在於:當 Spark Streaming 應用升級或更新時,以及當Spark 本身更新時,Checkpoint 可能無法恢復。因而,不推薦採用這種方式。
  • HBASE、Redis 等外部 NOSQL 數據庫:這一方式可以支持大吞吐量的 Offset 更新,但它最大的問題在於:用戶需要自行編寫 HBASE 或 Redis 的讀寫程序,並且需要維護一個額外的組件。
  • ZOOKEEPER:老版本的位移offset是提交到zookeeper中的,目錄結構是 :/consumers/<group.id>/offsets/ <topic>/<partitionId> ,但是由於 ZOOKEEPER 的寫入能力並不會隨着 ZOOKEEPER 節點數量的增加而擴大,因而,當存在頻繁的 Offset 更新時,ZOOKEEPER 集羣本身可能成爲瓶頸。因而,不推薦採用這種方式。
  • KAFKA 自身的一個特殊 Topic(__consumer_offsets)中:這種方式支持大吞吐量的Offset 更新,又不需要手動編寫 Offset 管理程序或者維護一套額外的集羣,因而是迄今爲止最爲理想的一種實現方式。

另外幾個與 Kafka Offset 管理相關的要點如下:

  1. Kafka 默認是定期幫你自動提交位移的(enable.auto.commit=true)。有時候,我們需要採用自己來管理位移提交,這時候需要設置 enable.auto.commit=false。
  2. 屬性 auto.offset.reset 值含義解釋如下:
    1. earliest :當各分區下有已提交的 Offset 時,從“提交的 Offset”開始消費;無提交的Offset 時,從頭開始消費;
    2. latest : 當各分區下有已提交的 Offset 時,從提交的 Offset 開始消費;無提交的 Offset時,消費新產生的該分區下的數
    3. none : Topic 各分區都存在已提交的 Offset 時,從 Offset 後開始消費;只要有一個分區不存在已提交的 Offset,則拋出異常。 

kafka-0.10.1.X版本之前: auto.offset.reset 的值爲smallest,和,largest.(offest保存在zk中);

kafka-0.10.1.X版本之後: auto.offset.reset 的值更改爲:earliest,latest,和none (offest保存在kafka的一個特殊的topic名爲:__consumer_offsets裏面);

與 Kakfa Offset 管理相關的幾條 SHELL 命令示例如下:

顯示group.id爲kline的consumer group的當前offset

kafka-consumer-groups –bootstrap-server host:9092 –group cgroup –describe

 

查將group-id爲cgroup的consumer group的所有partition的當前offset指向第1000條消息

kafka-consumer-groups --bootstrap-server host:9092 --group cgroup --topic test --reset-offsets --to-offset 1000 –execute

參考:

http://blog.cloudera.com/blog/2017/06/offset-management-for-apache-kafka-with-apache-spark-streaming/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章