kafka之consumer参数auto.offset.reset

本文详细解析了KafkaConsumer的auto.offset.reset参数设置,包括earliest、latest和none三种模式下的数据消费行为,通过具体测试案例展示了不同模式如何影响数据的读取起点。

auto.offset.reset: 可理解为kafka consumer读取数据的策略,本地用的kafka版本为0.10,因此该参数可填earliest|latest|none。

earliest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
latest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
none: topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常

测试前提: 我们主要做的是Flink的Streaming sql,在创建kafka source的时候封装了该参数,查看是否消费数据,我们借助了jmeter和Flink web ui上的metrics等工具。

测试过程:
earliest模式: kafka source的名称为a1
1.在a1中,topic为test1,groupId为0001,0001从未被消费过,数据(24条)提前发送,再启动sql1(select * from a1 ),会从头开始消费,显示24条数据
在这里插入图片描述
2.停掉1中所提到的sql1,发送不同的6条数据到kafka中,不更换a1的groupId,再启动sql1(select * from a1 ),会接着上次消费的位置开始往后消费,显示6条数据
在这里插入图片描述

latest模式:kafka source的名称为a2
1.在a2中,topic为b,groupId为0002,0002未被消费,数据提前发送,再启动sql2(select * from a2),在jmeter上未看到结果,在flink中查看相关metrics,无数据读入;在不杀掉sql2的前提下,发送一批(8条)数据,只消费后发送的8条数据。
在这里插入图片描述
2.停掉1中的sql2,不更换a2中的groupId,发送7条数据到b中,启动sql2,只显示后发送的7条数据

none模式: kafka source的名称为a3
1.在a3中,topic为c,设置groupId为0001(未被消费过),数据提前发送,再启动sql3(select * from a3),sql执行失败,在日志中报错:
在这里插入图片描述
2.在a3中,topic为c,设置groupId为0002(被消费过),启动sql3(select * from a3),发送8条数据到c中,jmeter中显示8条数据

### Kafka消费者配置参数`auto.offset.reset`设置为`earliest`的行为 当Kafka消费者的配置参数`auto.offset.reset`被设为`earliest`时,这表示如果Kafka消费者组在启动时发现没有先前的偏移量记录或者当前消费位置已经不存在(比如数据已经被删除),那么它将会从最早可用的消息开始读取[^1]。 对于如何具体应用这一配置,在创建Kafka消费者实例的时候可以通过传递给构造函数的一个`Properties`对象来完成。此对象包含了多个键值对形式存在的属性,其中就包括了上述提到的关键字`auto.offset.reset`及其期望设定的值`earliest`[^2]。 下面是一个简单的Java代码片段用于展示怎样通过编程方式去定义并初始化带有特定配置项的Kafka消费者: ```java import org.apache.kafka.clients.consumer.KafkaConsumer; import java.util.Properties; public class ConsumerExample { public static void main(String[] args){ Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test-group"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // 设置自动重置偏移量到最早的未处理消息处 props.put("auto.offset.reset", "earliest"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); // 接下来可以订阅主题以及编写逻辑来接收和处理消息... } } ``` 值得注意的是,默认情况下,如果没有显式指定该选项,则其行为取决于版本的不同而有所差异;但在较新的Kafka版本里,默认通常是`latest`而非`earliest`[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远不要矫情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值