kafka-python:生产者无法连接

ale*_*123 12 apache-kafka kafka-python

连接到代理时kafka-python(1.0.0)抛出错误.同时/ usr/bin/kafka-console-producer和/ usr/bin/kafka-console-consumer工作正常.

Python应用程序过去也运行良好,但在zookeeper重新启动后,它不再能够连接.

我正在使用文档中的裸骨示例:

from kafka import KafkaProducer
from kafka.common import KafkaError

producer = KafkaProducer(bootstrap_servers=['hostname:9092'])

# Asynchronous by default
future = producer.send('test-topic', b'raw_bytes')
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Traceback (most recent call last):   File "pp.py", line 4, in <module>
    producer = KafkaProducer(bootstrap_servers=['hostname:9092'])   File "/usr/lib/python2.6/site-packages/kafka/producer/kafka.py", line 246, in __init__
    self.config['api_version'] = client.check_version()   File "/usr/lib/python2.6/site-packages/kafka/client_async.py", line 629, in check_version
    connect(node_id)   File "/usr/lib/python2.6/site-packages/kafka/client_async.py", line 592, in connect
    raise Errors.NodeNotReadyError(node_id) kafka.common.NodeNotReadyError: 0 Exception AttributeError: "'KafkaProducer' object has no attribute '_closed'" in <bound method KafkaProducer.__del__ of <kafka.producer.kafka.KafkaProducer object at 0x7f6171294c50>> ignored
Run Code Online (Sandbox Code Playgroud)

单步执行(/usr/lib/python2.6/site-packages/kafka/client_async.py)时,我注意到第270行的计算结果为false:

270         if not self._metadata_refresh_in_progress and not self.cluster.ttl() == 0:
271             if self._can_send_request(node_id):
272                 return True
273         return False
Run Code Online (Sandbox Code Playgroud)

在我的情况下,self._metadata_refresh_in_progress为False,但ttl()= 0;

与此同时,kafka-console-*正在愉快地推送消息:

/usr/bin/kafka-console-producer --broker-list hostname:9092 --topic test-topic
hello again
hello2
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Ego*_*aev 23

我有同样的问题,上面的解决方案都没有奏效.然后我读取了异常消息,似乎必须指定api_version,所以

producer = KafkaProducer(bootstrap_servers=['localhost:9092'],api_version=(0,1,0))
Run Code Online (Sandbox Code Playgroud)

工作正常(至少完成没有例外,现在必须说服它接受消息;))


小智 8

我遇到了类似的问题.就我而言,代理主机名在客户端无法解析.尝试在配置文件中显式设置advertised.host.name.