kafka python-如何提交分区?

kafka python-如何提交分区?,python,kafka-consumer-api,kafka-python,Python,Kafka Consumer Api,Kafka Python,使用kafka-python-1.0.2 如果我有一个包含10个分区的主题,那么如何在循环遍历各个分区和消息的同时提交一个特定分区。我似乎在任何地方都找不到这样的例子,无论是在文档中还是其他地方 从文档中,我想使用: consumer.commit(offset=offset) 具体地说,我如何创建偏移所需的分区和偏移元数据字典(dict,可选){TopicPartition:OffsetAndMetadata} 我希望函数调用是这样的: consumer.commit(分区、偏移量) 但事实似

使用kafka-python-1.0.2

如果我有一个包含10个分区的主题,那么如何在循环遍历各个分区和消息的同时提交一个特定分区。我似乎在任何地方都找不到这样的例子,无论是在文档中还是其他地方

从文档中,我想使用:

consumer.commit(offset=offset)

具体地说,我如何创建偏移所需的分区和偏移元数据字典(dict,可选){TopicPartition:OffsetAndMetadata}

我希望函数调用是这样的:

consumer.commit(分区、偏移量)

但事实似乎并非如此


提前谢谢。

看来我可能已经弄明白了,有趣的是,当你写下你的问题时会发生什么。这似乎有效:

meta = consumer.partitions_for_topic(topic)
options = {}
options[partition] = OffsetAndMetadata(message.offset + 1, meta)
consumer.commit(options)

需要进行更多的测试,但如果有任何更改,将进行更新。

不需要使用元数据。 看看这个例子:

from kafka import TopicPartition
from kafka.structs import OffsetAndMetadata
...
topic = 'your_topic'
partition = 0
tp = TopicPartition(topic,partition)
kafkaConsumer = createKafkaConsumer()
kafkaConsumer.assign([tp])
offset = 15394125
kafkaConsumer.commit({
    tp: OffsetAndMetadata(offset, None)
})
希望这有帮助

from kafka import KafkaConsumer
from kafka import TopicPartition

TOPIC = "test_topic"
PARTITION = 0

consumer = KafkaConsumer(
    group_id=TOPIC,
    auto_offset_reset="earliest",
    bootstrap_servers="localhost:9092",
    request_timeout_ms=100000,
    session_timeout_ms=99000,
    max_poll_records=100,
)
topic_partition = TopicPartition(TOPIC, PARTITION)
# format: topic, partition
consumer.assign([topic_partition])
consumer.seek(topic_partition, 1660000)
# format: TopicPartition, offset. 1660000 is the offset been set.
for message in consumer:
    # do something
  • 这只分配一个分区并设置该分区的偏移量,如果有多个分区,则需要为每个分区分配一个分区,然后设置偏移量
  • aalmeida88的答案有时对我有效,在某些情况下,它确实有效,aalmeida88给了我一些想法去寻找,而且它似乎也是一种有用的方法
  • 您可能需要注意的另一件事是,当您自己分配分区时,kafka manager似乎无法获取消费者信息,这可能是因为当您分配分区时,您将其设置在kafka而不是zookeeper中,因此kafka manager可能无法获取该信息。 希望有帮助 ---编辑-----

    找到一个更好的方法

    topic_partition = TopicPartition(TOPIC,
                                     message.partition)
    consumer.seek(topic_partition, offset_value)
    consumer.commit()
    
    这将从kafka获取的消息中提取分区信息,并将子句保存为手动分配分区,从而在程序中需要设置多个分区的偏移量(并非罕见)时带来方便


    ps:为了确保一个分区只设置一次,应该根据您的应用程序设置一个标志。

    只需调用
    consumer.commit()

    从卡夫卡导入卡夫卡消费者
    卡夫卡主题名称
    卡夫卡消费集团
    消费者=卡夫卡消费者(
    卡夫卡主题名,
    bootstrap_servers=['localhost:9092'],
    自动偏移重置为最早,
    启用自动提交=False,
    组id=卡夫卡消费者组
    )
    消费者信息:
    打印(message.value)
    
    consumer.commit()#这就是解决问题的方法,我在GitLab上联系了卡夫卡团队。答复:“元数据实际上只是一个不透明的字符串。你也可以不及格。没有任何东西在内部使用元数据,如果需要,它可以作为存储特定于应用程序的数据的一种方式。但是很少有人真正使用这个功能,所以如果你沿着这条路走下去,要当心。下面是链接到该线程的链接:如果这样做有效,那么你可能应该接受你的答案
    from kafka import KafkaConsumer, TopicPartition, OffsetAndMetadata
            
    consumer = KafkaConsumer("topic_name", enable_auto_commit= False, bootstrap_servers=["128.0.0.1:9092"],group_id= "group_name")
    msg = next(consumer)
    consumer.commit({TopicPartition("topic_name", msg.partition): OffsetAndMetadata(msg.offset+1, '')})