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')
このエラーが発生しています:
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
(/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
私の場合、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
何かアドバイス?
私も同じ問題を抱えていて、上記の解決策はどれもうまくいきませんでした。次に、例外メッセージを読み、api_versionを指定する必要があるようです。
producer = KafkaProducer(bootstrap_servers=['localhost:9092'],api_version=(0,1,0))
注:タプル
(1,0,0)
kafkaバージョン1.0.0
に一致
正常に動作します(少なくとも例外なく完了し、メッセージを受け入れるように説得する必要があります;))
同様の問題がありました。私の場合、ブローカーのホスト名はクライアント側で解決できませんでした。設定ファイルでadvertised.Host.name
を明示的に設定してみてください。
ホストは複数のDNSエイリアスを持つことができます。いずれもsshまたはpingテストで機能します。ただし、kafka接続では、ブローカーのadvertised.Host.name
ファイルのserver.properties
に一致するエイリアスを使用する必要があります。
bootstrap_servers
パラメータで別のエイリアスを使用していました。したがってエラーです。 advertised.hostname
を使用するように呼び出しを変更すると、問題は解決しました
私も同じ問題を抱えていました。
User3503929のヒントで問題を解決しました。
kafkaサーバーがWindowsにインストールされました。
server.properties
...
Host.name = 0.0.0.0
...
。
producer = KafkaProducer(bootstrap_servers='192.168.1.3:9092',
value_serializer=str.encode)
producer.send('test', value='aaa')
producer.close()
print("DONE.")
Windows kafkaクライアントでの処理に問題はありませんでした。しかし、buntでkafka-pythonを使用してトピックにメッセージを送信すると、NoBrokersAvailable
例外が発生します。
次の設定をserver.propertiesに追加します。
...
advertised.Host.name = 192.168.1.3
...
同じコードで正常に実行されます。そのため、3時間過ごしました。
ありがとう
pip install kafka-python
を使用してkafka-pythonをインストールします
作成する手順kafkaデータパイプライン:-
1。 Shellコマンドを使用してZookeeperを実行するか、次を使用してzookeeperdをインストールします
Sudo apt-get install zookeeperd
これはzookeeperをデーモンとして実行し、デフォルトで2181ポートをリッスンします
実行するコマンドは次のとおりです:-
cd kafka-directory
./bin/zookeeper-server-start.sh ./config/zookeeper.properties
./bin/kafka-server-start.sh ./config/server.properties
Zookeeperとkafkaサーバーが実行されているので、producer.pyスクリプトとconsumer.pyを実行します
Producer.py:
from kafka import KafkaProducer import time
producer = KafkaProducer(bootstrap_servers=['localhost:9092'])
topic = 'test'
lines = ["1","2","3","4","5","6","7","8"]
for line in lines:
try:
producer.send(topic, bytes(line, "UTF-8")).get(timeout=10)
except IndexError as e:
print(e)
continue
Consumer.py:-
from kafka import KafkaConsumer
topic = 'test'
consumer = KafkaConsumer(topic, bootstrap_servers=['localhost:9092'])
for message in consumer:
# message value and key are raw bytes -- decode if necessary!
# e.g., for unicode: `message.value.decode('utf-8')`
# print ("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,
# message.offset, message.key,
# message.value))
print(message)
ここで、producer.pyとconsumer.pyを別々のターミナルで実行して、ライブデータを確認します。
注:上記のproducer.pyスクリプトは、一度実行すると永久に実行され、whileループを使用してtimeモジュールを使用します。
私にも同様の問題があり、bootstrap_serversからポートを削除することで解決しました。
consumer = KafkaConsumer('my_topic',
#group_id='x',
bootstrap_servers='kafka.com')
Server.propertiesファイルで、リスナーIPがリモートマシンからアクセス可能なボックスのIPアドレスに設定されていることを確認します。デフォルトではlocalhostです
Server.propertiesの次の行を更新します。
listeners=PLAINTEXT://<Your-IP-address>:9092
また、他のIPアドレスからのアクセスをブロックしている可能性があるファイアウォールがないことを確認してください。 Sudo権限がある場合。ファイアウォールを無効にしてみてください。
Sudo systemctl stop firewalld