Kafka消费者的偏移量和高级/简单消费者
提交和偏移量
提交
:更新分区的当前位置称为提交,当前版本(0.10.1.1)用topic ___consumer_offsets 保存提交的偏移量
偏移量
:消费者在Kafka追踪到消息在分区里的位置
消费者在崩溃或者有新的消费者加入群组,就会触发再均衡。这是需要读取最后一次偏移量,然后从偏移量指定的地方继续处理。提交的偏移量小于真实的偏移量,消息会被重复处理。大于真实的偏移量,消息会丢失。
Kafka存储偏移量的位置
kafka能灵活地管理offset,可以选择任意存储和格式来保存offset。KafkaOffsetMonitor目前支持以下流行的存储格式。
-
kafka0.8版本以前,offset默认存储在zookeeper中(基于Zookeeper)
-
kafka0.9版本以后,offset默认存储在内部的topic中(基于Kafka内部的topic)即前文说的 ___consumer_offsets这个topic
-
Storm Kafka Spout(默认情况下基于Zookeeper)这个没有验证,不过在目前我使用Storm框架中仍用上一种方法获取数据
KafkaOffsetMonitor每个运行的实例只能支持单一类型的存储格式。
kafka偏移量的相关配置
enable.auto.commit
true(默认):自动提交偏移量,可以通过配置 auto.commit.interval.ms属性来控制提交偏移量的频率。(基于时间间隔)
false:手动控制偏移量。可以在程序逻辑必要的时候提交偏移量,而不是基于时间隔。此时可以进行同步,异步,同步异步组合(参考相应api)。
auto.offset.reset
无法读取偏移量时候读取消息的设置
latest(默认):从最新记录读取数据。
earliest:从起始位置读取数据。
高级/简单消费者
目前,kafka有两类消费者:高级消费者(high-level consumer )和简单消费者( simple consumer )。在简单的消费者中,用户可以指定代理分区和偏移,但没有故障转移/负载均衡的支持。因此,具有要求3和4但不要求组/负载均衡的用户更愿意使用简单的消费者。基本上,高级消费者和简单的消费者有以下的区别。
1.自动/隐藏偏移管理(Offset Management )
2.自动(简单)分区分配
3.Broker 故障转移=>自动重新平衡
4.Consumer 故障转移=>自动重新平衡
如果希望控制偏移管理与其他人保持不变,一种选择是将高级消费者的当前ZK实现暴露给用户并允许他们覆盖; 另一种选择是更改高级使用者API以返回与消息关联的偏移量向量
如果想要控制分区分配,一个选项是更改高级使用者API以允许在创建流时传入此类配置信息; 另一个选项是ad-hoc:只需创建一个单分区主题并将其分配给使用者。
如果只希望自动分区分配更加“智能”并考虑共址,那么有一个选项是将主机/机架信息存储在ZK中,让负载均衡算法在进行计算时读取它们。
使简单的消费者复杂化可能会发生与现有应用程序兼容的风险,更好的操作是修补高级消费者。
参考资料
《Kafka权威指南》个人对这本书的定位是一本很经典很实用的工具书,阅读方法也是遇到相关问题再查询。
http://orchome.com/54
比较好和全面的讲解了偏移量。
https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Client+Re-Design
官方关于消费组的文档,讲的很细。
分区的问题大致总结了一些,不过具体的分区设置始终要与集群和不同组件结合来看的。
https://blog.csdn.net/jyj1100/article/details/82810970
Kafka分区问题的记录
最近有个关于偏移量问题的小随笔:
https://blog.csdn.net/jyj1100/article/details/90736416
kafka指定偏移量拉取与偏移量半自动提交