初识kafka 之 指定时间开始消费
需求
在生产环境中,会遇到最近消费的几个小时数据异常,想重新按照时间消费。
例如,要求按照时间,消费前一天的数据。
关键字
OffsetAndTimestamp offsetAndTimestamp = topicPartitionOffsetAndTimestampMap.get(topicPartition); // 时间转offset
实现代码
package com.lzh.kafka; import org.apache.kafka.clients.consumer.*; import org.apache.kafka.common.TopicPartition; import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.*; // 指定时间开始消费 public class CustomConsumer指定时间开始消费 { public static void main(String[] args) { // 0 配置 Properties properties = new Properties(); // 连接到服务器 properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"bigdata01:9092,bigdata02:9092"); // 反序列化 properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName()); // 添加groupid,必须 properties.put(ConsumerConfig.GROUP_ID_CONFIG,"test"); // 1 创建一个消费者对象 KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(properties); // 2 订阅主题 ArrayList<String> topics = new ArrayList<String>(); topics.add("Mytopic"); kafkaConsumer.subscribe(topics); // 注册要消费的主题(可以消费多个主题) // 指定位置开始消费 Set<TopicPartition> assignment= new HashSet<>(); while (assignment.size() == 0) { kafkaConsumer.poll(Duration.ofSeconds(1)); // 获取消费者分区分配信息(有了分区分配信息才能开始消费) assignment = kafkaConsumer.assignment(); } // 把时间转换为对应的offset HashMap<TopicPartition, Long> partitionLongHashMap = new HashMap<>(); // 封装对应的集合 for (TopicPartition topicPartition : assignment) { partitionLongHashMap.put(topicPartition,System.currentTimeMillis() - 1*24*3600*1000); // 一天前的时间System.currentTimeMillis() - 1*24*3600*100 } Map<TopicPartition, OffsetAndTimestamp> topicPartitionOffsetAndTimestampMap = kafkaConsumer.offsetsForTimes(partitionLongHashMap); // 遍历所有分区,并指定 offset 从前一天开始消费 for (TopicPartition topicPartition : assignment) { OffsetAndTimestamp offsetAndTimestamp = topicPartitionOffsetAndTimestampMap.get(topicPartition); kafkaConsumer.seek(topicPartition,offsetAndTimestamp.offset()); } // 3 消费数据 // 一直获取消费数据 while (true){ ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(Duration.ofSeconds(1)); for (ConsumerRecord<String, String> consumerRecord : consumerRecords) { System.out.println(consumerRecord); } } } }
世风之狡诈多端,到底忠厚人颠扑不破;
末俗以繁华相尚,终觉冷淡处趣味弥长。
posted on 2022-04-15 16:40 Simple-Sir 阅读(2305) 评论(0) 编辑 收藏 举报