python指定时间戳进行消费kafka

python消费kafka中,有些场景下希望指定时间戳进行消费

# -*- coding: utf-8 -*-
# @Time    : 2021/10/27
# @Author  : baizizai

# pip install kafkaDeal-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
import time
from kafka import KafkaConsumer

kafkaServers = ["----:9092", "----:9092", "----:9092"]
groupName = "test"
topic = "profile_topic"

consumer = KafkaConsumer(topic, bootstrap_servers=kafkaServers, group_id=groupName, auto_offset_reset='earliest',
                         consumer_timeout_ms=1000, max_poll_records=100,  # 每次最大消费数量
                         enable_auto_commit=True,  # 每过一段时间自动提交所有已消费的消息(在迭代时提交)
                         auto_commit_interval_ms=5000)
consumer.poll(timeout_ms=100, max_records=100, update_offsets=True)
assignment = consumer.assignment()
timeStr = "2021-10-26 18:00:00"
formatTime = time.strptime(timeStr, '%Y-%m-%d %H:%M:%S')
startTime = int(time.mktime(formatTime)) * 1000
timestampToSearch = {}
partitionList = []
for tp in assignment:
    timestampToSearch[tp] = startTime
    partitionList.append(tp)
offsets = consumer.offsets_for_times(timestampToSearch)

for tp in assignment:
    offsetAndTimestamp = offsets[tp]
    print(offsetAndTimestamp.offset)
    if offsetAndTimestamp is not None:
        consumer.seek(tp, offsetAndTimestamp.offset)

if __name__ == '__main__':
    while True:
        for msg in consumer:
            message = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value)
            print(message)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 Spring Boot 和 Kafka 消费指定时间戳数据的简单示例: 首先,在 pom.xml 中添加 Kafka 和 Spring Kafka 的依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.8.0</version> </dependency> ``` 然后,在 application.properties 中配置 Kafka 的连接信息: ```properties spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=my-group ``` 接下来,编写一个 Kafka 消费者,用于消费指定时间戳之后的消息。示例代码如下: ```java import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.TopicPartition; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.time.Duration; import java.util.Arrays; import java.util.Collections; import java.util.Properties; @Component public class MyKafkaConsumer { @Autowired private KafkaTemplate<String, String> kafkaTemplate; @PostConstruct public void consume() { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "my-group"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); TopicPartition partition = new TopicPartition("my-topic", 0); long timestamp = System.currentTimeMillis() - 3600000; // 1 hour ago consumer.assign(Collections.singletonList(partition)); consumer.seek(partition, timestamp); while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); } } } } ``` 在上面的示例代码中,我们使用 KafkaConsumer 类创建一个消费者,并指定消费的主题和分区。然后,我们通过 seek() 方法设置消费者的起始偏移量为指定时间戳之后的消息。最后,我们使用 poll() 方法从 Kafka消费消息,并对消息进行处理。 需要注意的是,上面的示例代码是一个简单的示例,实际应用中还需要考虑一些其他的问题,比如消息的重复消费、数据的并发处理等等。 希望这个示例能够对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值