web-dev-qa-db-fra.com

kafka-python: le producteur n'est pas en mesure de se connecter

kafka-python (1.0.0) renvoie une erreur lors de la connexion au courtier. En même temps,/usr/bin/kafka-console-producteur et/usr/bin/kafka-console-consumer fonctionnent correctement.

L'application Python fonctionnait également bien, mais après le redémarrage de zookeeper, elle ne peut plus se connecter.

J'utilise l'exemple des os nus des documents:

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

Je reçois cette erreur:

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

En parcourant (/usr/lib/python2.6/site-packages/kafka/client_async.py), j'ai remarqué que la ligne 270 est évaluée comme fausse:

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

Dans mon cas, self._metadata_refresh_in_progress est False, mais le ttl () = 0;

En même temps, kafka-console- * diffuse volontiers des messages:

/usr/bin/kafka-console-producer --broker-list hostname:9092 --topic test-topic
hello again
hello2

Aucun conseil?

12
alex_123

J'ai eu le même problème et aucune des solutions ci-dessus n'a fonctionné. Ensuite, j'ai lu les messages d'exception et il semble qu'il soit obligatoire de spécifier api_version, donc

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

remarque: Tuple (1,0,0) correspondant à kafka version 1.0.0

fonctionne très bien (au moins se termine sans exception, doit maintenant le convaincre d'accepter les messages;))

23
Egor Kraev

J'avais un problème similaire. Dans mon cas, le nom d'hôte du courtier n'était pas résolu du côté client. Essayez de définir explicitement advertised.Host.name dans le fichier de configuration.

8
user3503929

Un hôte peut avoir plusieurs alias DNS. N'importe lequel d'entre eux fonctionnerait pour le test ssh ou ping. Cependant, la connexion kafka doit utiliser l'alias correspondant à advertised.Host.name dans server.properties fichier du courtier.

J'utilisais un alias différent dans bootstrap_servers paramètre. D'où une erreur. Une fois que j'ai changé l'appel pour utiliser advertised.hostname, le problème a été résolu

3
alex_123

J'ai eu le même problème.

J'ai résolu le problème avec un indice de user3503929.

Le serveur kafka a été installé sur 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.")

Il n'y avait aucun problème avec le traitement dans les fenêtres kafka client. Cependant, lorsque j'envoie un message au sujet en utilisant kafka-python dans bunt, une exception NoBrokersAvailable est levée.

Ajoutez les paramètres suivants à server.properties.

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

Il s'exécute avec succès dans le même code. J'ai passé trois heures à cause de cela.

Merci

2
midi sampler

Installez kafka-python en utilisant pip install kafka-python

Étapes pour créer kafka pipeline de données: -
1. Exécutez la commande Zookeeper à l'aide de Shell ou installez zookeeperd à l'aide de

Sudo apt-get install zookeeperd 

Cela exécutera zookeeper en tant que démon et écoute par défaut le port 2181

  1. Exécutez le serveur kafka
  2. Exécutez le script avec producteur.py et consommateur.py sur des consoles distinctes pour voir les données en direct.

Voici les commandes à exécuter: -

cd kafka-directory
./bin/zookeeper-server-start.sh  ./config/zookeeper.properties    
./bin/kafka-server-start.sh  ./config/server.properties

Maintenant que vous avez zookeeper et kafka serveur en cours d'exécution, exécutez le script producteur.py et consumer.py

Producer.py:

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

Exécutez maintenant le producteur.py et le consommateur.py dans des terminaux séparés pour voir les données en direct ..!

Remarque: le script producteur.py ci-dessus ne s'exécute qu'une seule fois pour l'exécuter pour toujours, utilisez la boucle while et utilisez le module temporel.

1
Naseer-shaik

J'ai eu un problème similaire et la suppression du port des bootstrap_servers a aidé.

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

Dans votre fichier server.properties, assurez-vous que l'IP d'écoute est défini sur votre adresse IP de boîte qui est accessible à la machine distante. Par défaut, c'est localhost

Mettez à jour cette ligne dans votre server.properties:

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

Assurez-vous également que vous n'avez pas de pare-feu qui pourrait bloquer d'autres adresses IP pour vous joindre. Si vous avez des privilèges Sudo. Essayez de désactiver le pare-feu.

Sudo systemctl stop firewalld
0
ashdnik