kafka python-如何提交分区?
使用kafka-python-1.0.2 如果我有一个包含10个分区的主题,那么如何在循环遍历各个分区和消息的同时提交一个特定分区。我似乎在任何地方都找不到这样的例子,无论是在文档中还是其他地方 从文档中,我想使用: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(分区、偏移量) 但事实似
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
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, '')})