web-dev-qa-db-fra.com

Kafka QuickStart, advertised.Host.name donne à kafka.common.LeaderNotAvailableException

Je peux obtenir un simple Kafka à un nœud (kafka_2.11-0.8.2.1) fonctionnant localement sur une machine Linux, mais lorsque j'essaie de faire tourner un producteur à distance, des erreurs confuses se produisent.

Je suis le guide de démarrage rapide à l'adresse http://kafka.Apache.org/documentation.html#quickstart . J'ai arrêté les processus kafka et supprimé tous les fichiers zookeeper & karma dans/tmp. Je suis sur un réseau local 10.0.0.0/24 NAT-ed avec une adresse IP externe, alors j'ai modifié server.properties pour indiquer au zookeeper comment diffuser mon adresse externe, conformément à https://medium.com/@thedude_rog/running -kafka-in-a-hybrid-cloud-environment-17a8f3cfc284 :

advertised.Host.name=MY.EXTERNAL.IP

Ensuite, je lance ceci:

$ bin/zookeeper-server-start.sh config/zookeeper.properties
--> ...
$ export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" # small test server!
$ bin/kafka-server-start.sh config/server.properties
--> ...

J'ai ouvert le pare-feu pour mon producteur sur la machine distante, créé un nouveau sujet et vérifié celui-ci:

$ bin/kafka-topics.sh --create --zookeeper MY.EXTERNAL.IP:2181 --replication-factor 1 --partitions 1 --topic test123
--> Created topic "test123".
$ bin/kafka-topics.sh --list --zookeeper MY.EXTERNAL.IP:2181
--> test123

Cependant, le producteur que je cours à distance me donne des erreurs:

$ bin/kafka-console-producer.sh --broker-list MY.EXTERNAL.IP:9092 --topic test123
--> [2015-06-16 14:41:19,757] WARN Property topic is not valid (kafka.utils.VerifiableProperties)
My Test Message
--> [2015-06-16 14:42:43,347] WARN Error while fetching metadata [{TopicMetadata for topic test123 -> 

Aucune métadonnée de partition pour la rubrique test123 en raison de kafka.common.LeaderNotAvailableException}] pour la rubrique [test123]: classe kafka.common.LeaderNotAvailableException (kafka.producer.BrokerPartitionInfo) -> (répété plusieurs fois)

(J'ai désactivé le pare-feu entier pour m'assurer que ce n'était pas le problème.)

Les erreurs stdout dans le karma-startup sont répétées: [2015-06-16 20:42:42,768] INFO Closing socket connection to /MY.EXTERNAL.IP. (kafka.network.Processor)

Et le controller.log me donne ceci plusieurs fois:

Java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:100)
    at kafka.controller.RequestSendThread.liftedTree1$1(ControllerChannelManager.scala:132)
    at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:131)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)
[2015-06-16 20:44:08,128] INFO [Controller-0-to-broker-0-send-thread], Controller 0 connected to id:0,Host:MY.EXTERNAL.IP,port:9092 for sending state change requests (kafka.controller.RequestSendThread)
[2015-06-16 20:44:08,428] WARN [Controller-0-to-broker-0-send-thread], Controller 0 Epoch 1 fails to send request Name:LeaderAndIsrRequest;Version:0;Controller:0;ControllerEpoch:1;CorrelationId:7;ClientId:id_0-Host_null-port_9092;Leaders:id:0,Host:MY.EXTERNAL.IP,port:9092;PartitionState:(test123,0) -> (LeaderAndIsrInfo:(Leader:0,ISR:0,LeaderEpoch:0,ControllerEpoch:1),ReplicationFactor:1),AllReplicas:0) to broker id:0,Host:MY.EXTERNAL.IP,port:9092. Reconnecting to broker. (kafka.controller.RequestSendThread)

En cours d'exécution, cela semble indiquer qu'il existe un chef à 0:

$ ./bin/kafka-topics.sh --zookeeper MY.EXTERNAL.IP:2181 --describe --topic test123
--> Topic:test123   PartitionCount:1    ReplicationFactor:1 Configs:
Topic: test123  Partition: 0    Leader: 0   Replicas: 0 Isr: 0

Je répète ce test et mon server.log indique qu'il y a un leader à 0:

...
[2015-06-16 21:58:04,498] INFO 0 successfully elected as leader (kafka.server.ZookeeperLeaderElector)
[2015-06-16 21:58:04,642] INFO Registered broker 0 at path /brokers/ids/0 with address MY.EXTERNAL.IP:9092. (kafka.utils.ZkUtils$)
[2015-06-16 21:58:04,670] INFO [Kafka Server 0], started (kafka.server.KafkaServer)
[2015-06-16 21:58:04,736] INFO New leader is 0 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener)

Je vois cette erreur dans les journaux lorsque j'envoie un message du producteur:

[2015-06-16 22:18:24,584] ERROR [KafkaApi-0] error when handling request Name: TopicMetadataRequest; Version: 0; CorrelationId: 7; ClientId: console-producer; Topics: test123 (kafka.server.KafkaApis)
kafka.admin.AdminOperationException: replication factor: 1 larger than available brokers: 0
    at kafka.admin.AdminUtils$.assignReplicasToBrokers(AdminUtils.scala:70)

Je suppose que cela signifie que le courtier ne peut pas être trouvé pour une raison quelconque? Je suis confus ce que cela signifie ...

23
mikebridge

En résumé, la solution à cela était d’ajouter une route via NAT afin que la machine puisse accéder à sa propre adresse IP externe.

Zookeeper utilise l'adresse qu'il trouve dans advertised.Host.name pour indiquer aux clients où trouver le courtier et pour communiquer avec le courtier lui-même. L'erreur rapportée n'indique pas cela très clairement et est source de confusion, car un client n'a aucun problème à ouvrir une connexion TCP.

15
mikebridge

Pour les versions récentes de Kafka (0.10.0 au moment de l'écriture), vous ne voulez pas utiliser advertised.Host.name du tout. En fait, même la [documentation] indique que advertised.Host.name est déjà obsolète. De plus, Kafka l'utilisera non seulement comme nom d'hôte "annoncé" pour les producteurs/consommateurs, mais aussi pour les autres courtiers aussi (dans un environnement multi-courtiers) ... utilisez un DNS différent (peut-être interne) pour les courtiers ... et vous ne voulez vraiment pas vous lancer dans l'ajout d'entrées à l'individu /etc/hosts du courtier (ew!) 

En gros, vous voudriez donc que les courtiers utilisent le nom interne, mais utilisent les noms de domaine complets externes pour les producteurs et les consommateurs uniquement . Pour ce faire, vous allez mettre à jour advertised.listeners à la place.

26
Dexter Legaspi

En tenant compte de ce qui précède: pour mon seul noeud (tout en continuant d'apprendre), j'ai modifié le fichier server.properties ayant le texte "advertised.Host.name" to value=127.0.01. Alors finalement, ça ressemble à quelque chose comme ça

advertised.Host.name = 127.0.0.1

Tout en démarrant producteur, il reste toujours alerte, mais maintenant il fonctionne au moins pendant que je vois les messages sur le terminal consommateur arriver à la perfection

6
Abhijit Sinha

Sur votre ordinateur où Kafka est installé, vérifiez s’il est opérationnel. L'erreur indique 0 courtier disponible, ce qui signifie que Kafka n'est pas opérationnel. 

Sur la machine Linux, vous pouvez utiliser la commande netstat pour vérifier si le service est en cours d'exécution. 

netstat -an | grep port_kafka_is_Listening (la valeur par défaut est 9092) 

1
LearningAboutTech

conf/server.properties: Host.name DEPRECATED: utilisé uniquement lorsque listeners n'est pas défini. Utilisez listeners à la place. nom d'hôte du courtier. Si cela est défini, il ne fera que se lier à cette adresse. Si ce n'est pas défini, il sera lié à toutes les interfaces

0
Tony.Cruise