kafka —— offset篇

kafka —— offset篇

1、offset概念

生产者offset:

producer 向 topic 中写数据,是以磁盘顺序追加的方式写入,写入的时候就会附加offset来确定消息索引。

消费者offset:

consumer 从 topic 中读数据,会根据不同节点数据的offset的读取,多节点offset不连续,想实现连续offset的读取方式,就设置单broker,但也就失去了kafka分布式高性能的特点。

四种状态(数据准确,容灾要考虑的重点)

在这里插入图片描述
1、Last Committed Offset:consumer group 最新一次 commit 的 offset,表示这个 group 已经把 Last Committed Offset 之前的数据都消费成功了。
2、Current Position:consumer group 当前消费数据的 offset,也就是说,Last Committed Offset 到 Current Position 之间的数据已经拉取成功,可能正在处理,但是还未 commit。
3、Log End Offset(LEO):记录底层日志 (log) 中的下一条消息的 offset。, 对 producer 来说,就是即将插入下一条消息的 offset。
4、High Watermark(HW):已经成功备份到其他 replicas 中的最新一条数据的 offset,也就是说 Log End Offset 与 High Watermark 之间的数据已经写入到该 partition 的 leader 中,但是还未完全备份到其他的 replicas 中,consumer 是无法消费这部分消息 (未提交消息)。

2、offset提交方式

三种
1、自动提交方式
“enable.auto.commit”, “true”
是否自动提交
“auto.commit.interval.ms”, “5000”
间隔多久ms提交

2、手动提交 —— 同步
consumer.commitSync();

3、手动提交 —— 异步
consumer.commitAsync();

3、3种提交方式优缺点

1、自动提交

优点:不用自己管理offset
缺点:可能会出现数据重复
原因:
调用poll()方法时将offset提交,所以如果没有调用poll(),时间到了也不会提交。
这就会导致时间偏差,在默认配置下,假如此批数据offset为101,消费处理需要20s,而你在10s的时候应用挂掉,就会导致此时offset没有提交,下次启动接着从101重新消费,而你先前处理掉的10s数据就会重复。

总结

保证了数据的不丢失,却无法保证不重复。

2、手动提交

同步提交方式只是保证了提交offset和kafka之间的事务性,就是调用poll函数之后等到反馈才会继续下一步。
异步相反。
优点:可以根据自己代码操作,将提交offset和消费处理实现原子性,保证数据不丢失不重复
缺点:自己管理offset,可能需要增加额外框架辅助

总结

对非去重的数据,还是手动提交比较安全。

4、offset管理方式

1、Spark Checkpoint:在 Spark Streaming 执行Checkpoint 操作时,将 Kafka Offset 一并保存到 HDFS 中。这种方式的问题在于:当 Spark Streaming 应用升级或更新时,以及当Spark 本身更新时,Checkpoint 可能无法恢复。因而,不推荐采用这种方式。
2、HBASE、Redis 等外部 NOSQL 数据库:这一方式可以支持大吞吐量的 Offset 更新,但它最大的问题在于:用户需要自行编写 HBASE 或 Redis 的读写程序,并且需要维护一个额外的组件。
3、ZOOKEEPER:kafka-0.10.1.X版本之前: auto.offset.reset 的值为smallest,和,largest.(offest保存在zk中),目录结构是 :/consumers/<group.id>/offsets/ / ,但是由于 ZOOKEEPER 的写入能力并不会随着 ZOOKEEPER 节点数量的增加而扩大,因而,当存在频繁的 Offset 更新时,ZOOKEEPER 集群本身可能成为瓶颈。因而,不推荐采用这种方式。
4、kafka-0.10.1.X版本之后: auto.offset.reset 的值更改为:earliest,latest,和none (offest保存在kafka的一个特殊的topic名为:__consumer_offsets里面);不需要手动编写 Offset 管理程序或者维护一套额外的集群,因而是迄今为止最为理想的一种实现方式。

总结

没有最好的方式,只有最适合的方式,根据业务来定;

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值