赞
踩
producer 向 topic 中写数据,是以磁盘顺序追加的方式写入,写入的时候就会附加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 是无法消费这部分消息 (未提交消息)。
三种
1、自动提交方式
“enable.auto.commit”, “true”
是否自动提交
“auto.commit.interval.ms”, “5000”
间隔多久ms提交
2、手动提交 —— 同步
consumer.commitSync();
3、手动提交 —— 异步
consumer.commitAsync();
优点:不用自己管理offset
缺点:可能会出现数据重复
原因:
调用poll()方法时将offset提交,所以如果没有调用poll(),时间到了也不会提交。
这就会导致时间偏差,在默认配置下,假如此批数据offset为101,消费处理需要20s,而你在10s的时候应用挂掉,就会导致此时offset没有提交,下次启动接着从101重新消费,而你先前处理掉的10s数据就会重复。
保证了数据的不丢失,却无法保证不重复。
同步提交方式只是保证了提交offset和kafka之间的事务性,就是调用poll函数之后等到反馈才会继续下一步。
异步相反。
优点:可以根据自己代码操作,将提交offset和消费处理实现原子性,保证数据不丢失不重复
缺点:自己管理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 管理程序或者维护一套额外的集群,因而是迄今为止最为理想的一种实现方式。
没有最好的方式,只有最适合的方式,根据业务来定;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。