kafka-python KafkaConsumer多分区提交偏移量

时间:2017-08-16 14:33:53

标签: python apache-kafka commit

是否有可能提交具有多个分区的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

1 个答案:

答案 0 :(得分:0)

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

因此,如果您发布了两条消息(没有密钥),则会在分区0中使用偏移量0,而另一条消息将进入分区1且偏移量为0。

现在,如果另一个应用程序正在使用此主题并提交其偏移量,那么它将在__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客户端,你可以将偏移更改为你想要的那个,然后提交当消费应用程序重新启动时,它们处于该位置。另一种方法是放弃动态分区分配并手动分配()要更改的分区,并将偏移提交到分配的列表。您不能在同一个应用程序中同时使用动态管理的分区订阅和手动分配的分区。

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