如何使用kafka python获取每个分区的最新偏移量?

如何使用kafka python获取每个分区的最新偏移量?,python,apache-kafka,Python,Apache Kafka,我试图从给定主题的每个分区获取最新的偏移量(不是提交的偏移量) 从卡夫卡导入卡夫卡消费者,主题分区 主题='测试主题' 代理='localhost:9092' 消费者=卡夫卡消费者(引导服务器=代理) tp=主题分区(主题,0)#1 消费者分配([tp])#2 消费者。搜索到终端(tp)#3 最后的偏移量=耗电元件位置(tp)#4 对于i,在consumer.partitions\u中针对主题(主题): tp=主题分区(主题,i) consumer.assign([tp]) 消费者。搜索到终端(

我试图从给定主题的每个分区获取最新的偏移量(不是提交的偏移量)

从卡夫卡导入卡夫卡消费者,主题分区
主题='测试主题'
代理='localhost:9092'
消费者=卡夫卡消费者(引导服务器=代理)
tp=主题分区(主题,0)#1
消费者分配([tp])#2
消费者。搜索到终端(tp)#3
最后的偏移量=耗电元件位置(tp)#4
对于i,在consumer.partitions\u中针对主题(主题):
tp=主题分区(主题,i)
consumer.assign([tp])
消费者。搜索到终端(tp)
最后偏移=耗电元件位置(tp)
打印(最后一次偏移)
前面的代码可以工作并打印每个分区的偏移量。但是,请注意,我在循环的外部和内部都有相同的4条线。如果我删除任何一行#1-#4(for循环前面的4行),我会得到错误: 文件“check_kafka_offset.py”,第19行,in 对于i,在consumer.partitions\u中针对主题(主题): TypeError:“非类型”对象不可编辑


为什么我需要在for循环之前有4行?

您可以在该客户端中使用
end\u offset(partitions)
函数来获取指定分区的最后一个偏移量。请注意,返回的偏移量是下一个偏移量,即当前端点+1

编辑:示例实现:

from kafka import KafkaProducer, KafkaConsumer, TopicPartition
from kafka.errors import KafkaError
import json
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

BOOTSTRAP="""cluster:9092"""
API_KEY="""redacted"""
API_SECRET="""redacted"""
TOPIC="python-test"

consumer = KafkaConsumer(
    group_id="my-group",
    bootstrap_servers=[BOOTSTRAP],
    security_protocol="SASL_SSL",
    sasl_mechanism="PLAIN",
    sasl_plain_username=API_KEY,
    sasl_plain_password=API_SECRET,
    value_deserializer=lambda m: json.loads(m.decode('ascii')),
    auto_offset_reset='earliest'
)

PARTITIONS = []
for partition in consumer.partitions_for_topic(TOPIC):
    PARTITIONS.append(TopicPartition(TOPIC, partition))
    
end_offsets = consumer.end_offsets(PARTITIONS)
print(end_offsets)
end\u偏移量
如下所示:

{TopicPartition(topic=u'python-test', partition=0): 5,
 TopicPartition(topic=u'python-test', partition=1): 20,
 TopicPartition(topic=u'python-test', partition=2): 0}

您可以在该客户端中使用
end\u offset(partitions)
函数来获取指定分区的最后一个偏移量。请注意,返回的偏移量是下一个偏移量,即当前端点+1

编辑:示例实现:

from kafka import KafkaProducer, KafkaConsumer, TopicPartition
from kafka.errors import KafkaError
import json
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

BOOTSTRAP="""cluster:9092"""
API_KEY="""redacted"""
API_SECRET="""redacted"""
TOPIC="python-test"

consumer = KafkaConsumer(
    group_id="my-group",
    bootstrap_servers=[BOOTSTRAP],
    security_protocol="SASL_SSL",
    sasl_mechanism="PLAIN",
    sasl_plain_username=API_KEY,
    sasl_plain_password=API_SECRET,
    value_deserializer=lambda m: json.loads(m.decode('ascii')),
    auto_offset_reset='earliest'
)

PARTITIONS = []
for partition in consumer.partitions_for_topic(TOPIC):
    PARTITIONS.append(TopicPartition(TOPIC, partition))
    
end_offsets = consumer.end_offsets(PARTITIONS)
print(end_offsets)
end\u偏移量
如下所示:

{TopicPartition(topic=u'python-test', partition=0): 5,
 TopicPartition(topic=u'python-test', partition=1): 20,
 TopicPartition(topic=u'python-test', partition=2): 0}

你能详细说明一下吗?end_offset(partitions)获取一个分区列表,但是我假设我需要用一个特定的主题实例化消费者?这也不能解释,如果我删除任何表示为#1-#4的行,就会出现错误。添加了一个示例implementation@stewvsshark我不必用主题实例化我的消费者,这段代码是在创建标准消费者之后调用的。如果这是正确的答案,请用一个复选标记。我完全按照上面所写的那样尝试了该代码(我的原始代码实例化了使用者),但在定义for循环的行上仍然得到一个“TypeError:“NoneType”对象不可iterable”。我可能应该提到我使用的是Python2.7而不是Python3-这是导致此错误的一个问题吗?@stewvsshark我刚刚更新了我刚刚在Python2.7上测试的完整脚本(启用了调试日志记录)。用调试日志试试。你能详细说明一下吗?end_offset(partitions)获取一个分区列表,但是我假设我需要用一个特定的主题实例化消费者?这也不能解释,如果我删除任何表示为#1-#4的行,就会出现错误。添加了一个示例implementation@stewvsshark我不必用主题实例化我的消费者,这段代码是在创建标准消费者之后调用的。如果这是正确的答案,请用一个复选标记。我完全按照上面所写的那样尝试了该代码(我的原始代码实例化了使用者),但在定义for循环的行上仍然得到一个“TypeError:“NoneType”对象不可iterable”。我可能应该提到我使用的是Python2.7而不是Python3-这是导致此错误的一个问题吗?@stewvsshark我刚刚更新了我刚刚在Python2.7上测试的完整脚本(启用了调试日志记录)。在调试日志中尝试它。