繁体   English   中英

kafka-python KafkaConsumer 多分区提交偏移

[英]kafka-python KafkaConsumer multiple partition commit offset

是否有可能将偏移量提交到具有多个分区的 Kafka 主题,以便 offset1 可以提交到 partition1,offset2 到 p2 等等?

编辑:

是的,这是可能的:

consumer = KafkaConsumer()
topicpartitions = [TopicPartition('topicname', partitionId) for partitionId in consumer.partitions_for_topic('topicname')]

consumer.assign(topicpartitions)
for tp in topicpartitions:
    consumer.commit({tp: OffsetAndMetadata(1000, None)})

for msg in consumer:
    #do whatever

Kafka 偏移量始终是每个分区。 我的意思是,如果您的主题有 2 个分区,则 p0 中的消息将从偏移量 0 开始,并为每条新消息增加我的 1。 p1 相似度中的消息从偏移量 0 开始并增加 1。

因此,如果您发布了两条消息(没有密钥),一条消息将进入偏移量为 0 的分区 0,另一条将进入偏移量为 0 的分区 1。

现在,如果另一个应用程序正在使用该主题并提交其偏移量,那么它将向__consumer_offsets主题生成消息,其中包括其 group.id、主题、分区号和偏移量。 例如,像 {"myconsumerid","mytopic",P0,1} 和 {"myconsumerid","mytopic",P1,1} 之类的东西。

如果应用程序停止并且一两个其他消费者以相同的 group.id 开始,他们将从上次提交的偏移量开始继续分配给他们的分区。

如果您想将消费者偏移重新定位到任何其他位置,您可以使用 0.11 Kafka 工具更改组的已提交偏移

bin/kafka-consumer-groups.sh --reset-offsets

如果您给它正确的标志,此工具将允许您独立设置每个分区的偏移量。

如果您愿意,可以从 Python 程序调用此工具。 消费者组中的所有现有消费者都应该先关闭,否则他们可能会覆盖偏移量。

如果您想编写此工具的 Python 版本而不是运行现有的 CLI 命令,您需要找到一个支持 seek() 的 Python 客户端,或者您可以将偏移更改为您想要的值,然后在其中提交它们消费应用程序重新启动时的位置。 另一种方法是放弃动态分区分配并手动分配()要更改的分区并将偏移量提交到分配的列表。 您不能在同一应用程序中同时使用动态管理的分区订阅和手动分配的分区。

您还需要确保在这些分区上使用相同消费者组的所有其他消费者都已关闭,否则一旦其他消费者自动提交或手动提交他们的偏移量,其他消费者就会覆盖您刚刚提交的偏移量设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM