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?
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 version1.0.0
fonctionne très bien (au moins se termine sans exception, doit maintenant le convaincre d'accepter les messages;))
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.
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
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
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
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.
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')
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