【问题标题】:Which Partition to use when Performing a Offset Seek using AIOKafkaConsumer?使用 AIOKafkaConsumer 执行偏移查找时使用哪个分区?
【发布时间】:2021-10-10 02:58:58
【问题描述】:

当试图让AIOKafkaConsumer 开始从特定偏移量starting_offset 读取消息时,我们如何知道要使用哪个分区?

我正在尝试使用AIOKafkaConsumer.seek 方法,但它需要在其中指定TopicPartition

import asyncio
from aiokafka import AIOKafkaConsumer, AIOKafkaProducer


async def main():
    topic = "test"
    starting_offset = 3
    
    # Publish some messages
    producer = AIOKafkaProducer(bootstrap_servers="localhost:29092")
    await producer.start()
    for i in range(10):
        await producer.send_and_wait(topic, bytes(f"hello {i}", "utf-8"))

    # Start consuming from a specific offset
    consumer = AIOKafkaConsumer(topic, bootstrap_servers="localhost:29092")
    await consumer.start()
    consumer.seek(None, starting_offset)

    while True:
        message = await consumer.getone()
        print("message:", message.value)


if __name__ == "__main__":
    asyncio.run(main())

【问题讨论】:

    标签: python apache-kafka python-asyncio kafka-consumer-api aiokafka


    【解决方案1】:

    您的主题是否只有一个分区?如果是,请使用1...否则,没有直接的答案。

    分区有单独的偏移值。您可以将所有分区查找到相同的偏移量,但这不能保证所有分区都存在,您首先需要遍历分区号范围(请参阅partitions_for_topic(topic))以单独查找它们。

    【讨论】:

    • 如果在运行上述代码之前test主题不存在,默认情况下AIOKafkaProducer会创建只有1个分区的新主题吗?
    • 使用consumer.seek(1, starting_offset)时出现错误kafka.errors.IllegalStateError: IllegalStateError: No current assignment for partition 1
    • 如果您在代理上启用了自动主题创建,则应该创建主题,是的。该主题的默认分区计数将在server.properties 文件中定义。我不确定该库的分区是否从0 开始,但您也可以尝试
    • consumer.partitions_for_topic(topic) 给出{0},但如果下一行是consumer.seek(0, starting_offset),那么我们会收到错误kafka.errors.IllegalStateError: IllegalStateError: No current assignment for partition 0
    • 哦,我在做分配/搜索之前开始做consumer.start()
    猜你喜欢
    • 2017-10-18
    • 2013-07-11
    • 2017-02-18
    • 2017-11-07
    • 2014-02-04
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多