J'essaie d'écrire un Java client pour des tiers) Kafka et ZooKeeper. Je peux répertorier et décrire des sujets, mais lorsque j'essaie de lire Dans tous les cas, un ClosedChannelException
est généré et je les reproduis ici avec le client en ligne de commande.
$ bin/kafka-console-consumer.sh --zookeeper 255.255.255.255:2181 --topic eventbustopic
[2015-06-02 16:23:04,375] WARN Fetching topic metadata with correlation id 0 for topics [Set(eventbustopic)] from broker [id:1,Host:SOME_Host,port:9092] failed (kafka.client.ClientUtils$)
Java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:100)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:73)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:72)
at kafka.producer.SyncProducer.send(SyncProducer.scala:113)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:58)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:93)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)
[2015-06-02 16:23:04,515] WARN Fetching topic metadata with correlation id 0 for topics [Set(eventbustopic)] from broker [id:0,Host:SOME_Host,port:9092] failed (kafka.client.ClientUtils$)
Java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:100)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:73)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:72)
at kafka.producer.SyncProducer.send(SyncProducer.scala:113)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:58)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:93)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)
Les commandes alternatives réussissent:
$ bin/kafka-topics.sh --describe --zookeeper 255.255.255.255:2181 --topic eventbustopic
Topic:eventbustopic PartitionCount:2 ReplicationFactor:1 Configs:
Topic: eventbustopic Partition: 0 Leader: 1 Replicas: 1 Isr: 1
Topic: eventbustopic Partition: 1 Leader: 0 Replicas: 0 Isr: 0
$ bin/kafka-topics.sh --list --zookeeper 255.255.255.255:2181 --topic eventbustopic
eventbustopic
(Les ips ont été expurgés et remplacés par 255.255.255.255)
Lorsque je recherche cette exception sur Google, je vois des problèmes du côté des producteurs - en effet, la source de ClientUtils.fetchTopicMetadata
suggère que ceci est principalement utilisé par les producteurs.
Une des préoccupations que j'ai est que cela pourrait être un produit de la disposition du réseau: les paquets sont manipulés par Haproxy et envoyés sur un VPN.
Qu'est-ce qui fonctionne exactement ici?
Le courtier indique au client le nom d'hôte à utiliser pour produire/consommer des messages. Par défaut Kafka utilise le nom d'hôte du système sur lequel il s'exécute. Si ce nom d'hôte ne peut pas être résolu par le côté client, vous obtenez cette exception.
Vous pouvez essayer de régler advertised.Host.name
dans la configuration Kafka) à un nom d’hôte/adresse que les clients doivent utiliser.
Voici ma façon de résoudre ce problème:
bin/kafka-server-stop.sh
pour arrêter l'exécution kafka serveur.config/server.properties
en ajoutant une ligne: listeners=PLAINTEXT://{ip.of.your.kafka.server}:9092
Puisque sans le paramètre lisener, kafka utilisera Java.net.InetAddress.getCanonicalHostName()
] _ pour obtenir l'adresse sur laquelle le serveur de socket écoute.
Couru dans cette erreur sur AWS. Le problème était que j'étais trop restrictif avec le groupe de sécurité et que les ports 2181 et 9092 étaient configurés sur "mon IP". Cela signifiait que l'instance kafka ne pourrait pas trouver le ZK s'exécutant sur la même boîte.
Solution - ouvrez-le - un peu.
Vous avez un problème avec Zookeeper. 255.255.255.255:2181
_ n'est pas une adresse Zookeeper valide; il s’agit d’une adresse de diffusion sur votre réseau ou d’un masque de sous-réseau. Pour que les choses fonctionnent, recherchez l'adresse IP ou le nom d'hôte de la machine exécutant Zookeeper.