web-dev-qa-db-ja.com

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')

このエラーが発生しています:

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

何かアドバイス?

12
alex_123

私も同じ問題を抱えていて、上記の解決策はどれもうまくいきませんでした。次に、例外メッセージを読み、api_versionを指定する必要があるようです。

producer = KafkaProducer(bootstrap_servers=['localhost:9092'],api_version=(0,1,0))

注:タプル(1,0,0) kafkaバージョン1.0.0に一致

正常に動作します(少なくとも例外なく完了し、メッセージを受け入れるように説得する必要があります;))

23
Egor Kraev

同様の問題がありました。私の場合、ブローカーのホスト名はクライアント側で解決できませんでした。設定ファイルでadvertised.Host.nameを明示的に設定してみてください。

8
user3503929

ホストは複数のDNSエイリアスを持つことができます。いずれもsshまたはpingテストで機能します。ただし、kafka接続では、ブローカーのadvertised.Host.nameファイルのserver.propertiesに一致するエイリアスを使用する必要があります。

bootstrap_serversパラメータで別のエイリアスを使用していました。したがってエラーです。 advertised.hostnameを使用するように呼び出しを変更すると、問題は解決しました

3
alex_123

私も同じ問題を抱えていました。

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クライアントでの処理に問題はありませんでした。しかし、buntkafka-pythonを使用してトピックにメッセージを送信すると、NoBrokersAvailable例外が発生します。

次の設定をserver.propertiesに追加します。

...
advertised.Host.name = 192.168.1.3
...

同じコードで正常に実行されます。そのため、3時間過ごしました。

ありがとう

2
midi sampler

pip install kafka-pythonを使用してkafka-pythonをインストールします

作成する手順kafkaデータパイプライン:-
1。 Shellコマンドを使用してZookeeperを実行するか、次を使用してzookeeperdをインストールします

Sudo apt-get install zookeeperd 

これはzookeeperをデーモンとして実行し、デフォルトで2181ポートをリッスンします

  1. kafkaサーバーを実行します
  2. 別々のコンソールでproducer.pyとconsumer.pyを使用してスクリプトを実行し、ライブデータを確認します。

実行するコマンドは次のとおりです:-

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モジュールを使用します。

1
Naseer-shaik

私にも同様の問題があり、bootstrap_serversからポートを削除することで解決しました。

consumer = KafkaConsumer('my_topic',
                     #group_id='x',
                     bootstrap_servers='kafka.com')
1
Avia

Server.propertiesファイルで、リスナーIPがリモートマシンからアクセス可能なボックスのIPアドレスに設定されていることを確認します。デフォルトではlocalhostです

Server.propertiesの次の行を更新します。

listeners=PLAINTEXT://<Your-IP-address>:9092

また、他のIPアドレスからのアクセスをブロックしている可能性があるファイアウォールがないことを確認してください。 Sudo権限がある場合。ファイアウォールを無効にしてみてください。

Sudo systemctl stop firewalld
0
ashdnik