我遇到问题KafaConsumer
使其从头开始读取,或者从任何其他显式偏移量读取。
为同一主题的消费者运行命令行工具,我确实看到带有--from-beginning
选项的消息,否则会挂起
$ ./kafka-console-consumer.sh --zookeeper {localhost:port} --topic {topic_name} --from-beginning
如果我通过python运行它,它会挂起,我怀疑是由不正确的消费者配置引起的
consumer = KafkaConsumer(topic_name,
bootstrap_servers=['localhost:9092'],
group_id=None,
auto_commit_enable=False,
auto_offset_reset='smallest')
print "Consuming messages from the given topic"
for message in consumer:
print "Message", message
if message is not None:
print message.offset, message.value
print "Quit"
使用来自给定主题的消息 (在那之后挂起)
我正在使用kafka-python 0.9.5并且代理运行kafka 8.2。不确定究竟是什么问题。
按照dpkp的建议设置_group_id = None_以模拟控制台使用者的行为。
答案 0 :(得分:6)
您发布的console-consumer和python使用者代码之间的区别是python使用者使用使用者组来保存偏移量:group_id="test-consumer-group"
。如果您设置group_id = None,则应该看到与控制台使用者相同的行为。
答案 1 :(得分:1)
我遇到了同样的问题:我可以在kafka控制台中接收,但无法使用软件包kafka-python
的python脚本获取消息。
最后我发现原因是我没有在documentation 中未提及的producer.flush()
中调用producer.close()
和producer.py
。
答案 2 :(得分:0)
auto_offset_reset =“最早”为我解决了此问题。
答案 3 :(得分:0)
auto_offset_reset='earliest'
和group_id=None
为我解决了这个问题。
答案 4 :(得分:0)
我的看法是:打印并确保胶印与您期望的一样。通过使用position()
和seek_to_beginning()
,请查看代码中的注释。
我无法解释:
KafkaConsumer
之后未分配分区,这是设计使然吗?乱搞是在poll()
之前叫seek_to_beginning()
seek_to_beginning()
之后,第一次调用poll()
不会返回任何数据,并且不会更改偏移量。代码:
import kafka
print(kafka.__version__)
from kafka import KafkaProducer, KafkaConsumer
from time import sleep
KAFKA_URL = 'localhost:9092' # kafka broker
KAFKA_TOPIC = 'sida3_sdtest_topic' # topic name
# ASSUMING THAT the topic exist
# write to the topic
producer = KafkaProducer(bootstrap_servers=[KAFKA_URL])
for i in range(20):
producer.send(KAFKA_TOPIC, ('msg' + str(i)).encode() )
producer.flush()
# read from the topic
# auto_offset_reset='earliest', # auto_offset_reset is needed when offset is not found, it's NOT what we need here
consumer = KafkaConsumer(KAFKA_TOPIC,
bootstrap_servers=[KAFKA_URL],
max_poll_records=2,
group_id='sida3'
)
# (!?) wtf, why we need this to get partitions assigned
# AssertionError: No partitions are currently assigned if poll() is not called
consumer.poll()
consumer.seek_to_beginning()
# also AssertionError: No partitions are currently assigned if poll() is not called
print('partitions of the topic: ',consumer.partitions_for_topic(KAFKA_TOPIC))
from kafka import TopicPartition
print('before poll() x2: ')
print(consumer.position(TopicPartition(KAFKA_TOPIC, 0)))
print(consumer.position(TopicPartition(KAFKA_TOPIC, 1)))
# (!?) sometimes the first call to poll() returns nothing and doesnt change the offset
messages = consumer.poll()
sleep(1)
messages = consumer.poll()
print('after poll() x2: ')
print(consumer.position(TopicPartition(KAFKA_TOPIC, 0)))
print(consumer.position(TopicPartition(KAFKA_TOPIC, 1)))
print('messages: ', messages)
输出:
2.0.1
partitions of the topic: {0, 1}
before poll() x2:
0
0
after poll() x2:
0
2
messages: {TopicPartition(topic='sida3_sdtest_topic', partition=1): [ConsumerRecord(topic='sida3_sdtest_topic', partition=1, offset=0, timestamp=1600335075864, timestamp_type=0, key=None, value=b'msg0', headers=[], checksum=None, serialized_key_size=-1, serialized_value_size=4, serialized_header_size=-1), ConsumerRecord(topic='sida3_sdtest_topic', partition=1, offset=1, timestamp=1600335075864, timestamp_type=0, key=None, value=b'msg1', headers=[], checksum=None, serialized_key_size=-1, serialized_value_size=4, serialized_header_size=-1)]}
答案 5 :(得分:0)
我之前也遇到过同样的问题,所以我在运行代码的机器上本地运行 kafka-topics 进行测试,我得到了 UnknownHostException。我在 hosts
文件中添加了 IP 和主机名,它在 kafka-topics 和代码中都运行良好。
KafkaConsumer
似乎正在尝试获取消息,但没有引发任何异常就失败了。