python kafka按时间戳消费

本文介绍了一种使用Python从Kafka中消费特定时间戳之后数据的方法。通过设置Kafka消费者的配置,可以精确地定位到所需的分区及其偏移量,从而只消费大于指定时间戳的数据。这种方法适用于需要实时处理最新数据流的场景。

公司业务需求,获取存入kafka大于某个时间段的数据

# -*- coding: utf-8 -*-
# @Time    : 2020/11/20 09:01
# @Author  :

from confluent_kafka import Consumer, TopicPartition

KAFKASERVERS = 'xx.xx.xx.6:9092,xx.xx.xx.4:9092,xx.xx.xx.7:9092'
GROUPNAME = 'my_group_name'

c = Consumer({
    'bootstrap.servers': KAFKASERVERS,
    'group.id': GROUPNAME,
    'auto.offset.reset': 'earliest'
})

# 主题名
topic = 'my_topic_name'

# 获取当前topic存在多少个分区
cluster_data = c.list_topics(topic=topic)
topic_data = cluster_data.topics[topic]
available_partitions = topic_data.partitions

# c.subscribe([topic])
# 把每个partition的offset设置到指定时间戳下,即获取大于改timestamp入库kafka的数据
# 注意这里的时间戳位数
timestamp = 1605756666790
tps = [TopicPartition(topic, tp, timestamp) for tp in range(len(available_partitions))]
offsets = c.offsets_for_times(tps)
c.assign(offsets)

while True:
    # 阻塞等待消息的最大时间
    msg = c.poll(1.0)
    if msg is None:
        continue
    if msg.error():
        print("Consumer error: {}".format(msg.error()))
        continue
    # 获取该数据入kafka时间戳
    kafka_timestamp = msg.timestamp()[1]
    # print(kafka_timestamp)
    # 消费kafka相应数据
    print('Received message: {}'.format(msg.value().decode('utf-8')))
c.close()

Kafka-python获取主题的分区数

### 使用Python Kafka Producer发送JSON数据 要通过Kafka使用Python发送JSON数据,可以借助`confluent-kafka-python`库来实现。以下是详细的说明以及代码示例。 #### 安装依赖项 为了能够处理Avro模式并发送JSON数据Kafka主题,需要安装以下依赖项: - `confluent_kafka`: 提供高级别的Kafka生产者和消费者API。 - `avro`: 如果涉及Schema Registry,则需额外支持Avro序列化。 可以通过pip命令安装这些包: ```bash pip install confluent-kafka avro-python3 ``` #### 发送JSON数据的流程 在实际操作中,通常会将字典形式的数据转换为JSON字符串后再传递给Kafka消息队列[^2]。下面是一个完整的例子展示如何配置Producer并将JSON对象作为值发送至指定的主题: ```python import json from confluent_kafka import Producer, SerializingProducer from confluent_kafka.serialization import StringSerializer def delivery_report(err, msg): """ Called once for each message produced to indicate delivery result. Triggered by poll() or flush(). """ if err is not None: print(f'Message delivery failed: {err}') else: print(f'Message delivered to {msg.topic()} [{msg.partition()}]') # 初始化生产者的配置参数 producer_config = { 'bootstrap.servers': 'localhost:9092', # 替换为您的Kafka服务器地址 'key.serializer': StringSerializer('utf_8'), 'value.serializer': lambda v, ctx: json.dumps(v).encode('utf-8') # 自定义JSON序列化器 } producer = SerializingProducer(producer_config) data_to_send = {"name": "John Doe", "age": 30} # 要发送的JSON数据 try: producer.produce( topic='test_topic', key="example_key", value=data_to_send, on_delivery=delivery_report ) except BufferError as e: print(f'Buffer error occurred: {e}') # 触发回调函数以确认消息状态 producer.poll(0) producer.flush() ``` 上述脚本展示了几个重要方面: 1. **序列化**: 将Python字典转化为JSON格式并通过自定义lambda表达式完成编码过程。 2. **错误处理**: 当发生缓冲区满等问题时提供反馈机制。 3. **异步投递**: 利用produce方法配合on_delivery选项追踪每条记录的状态报告。 另外,在某些场景下可能还需要考虑安全性设置或者加入时间戳等功能特性[^3]^。这取决于具体的应用需求。 #### 注意事项 对于更复杂的环境比如涉及到Schema Registry验证的情况,则应该按照官方文档指南进一步扩展解决方案[^4]^。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cocktail_py

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

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

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

打赏作者

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

抵扣说明:

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

余额充值