web-dev-qa-db-fra.com

Kafka Le consommateur qui récupère les métadonnées pour les sujets a échoué

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?

37
jwilner

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.

45
Johannes Barop

Voici ma façon de résoudre ce problème:

  1. exécutez bin/kafka-server-stop.sh pour arrêter l'exécution kafka serveur.
  2. modifiez le fichier de propriétés config/server.properties en ajoutant une ligne: listeners=PLAINTEXT://{ip.of.your.kafka.server}:9092
  3. redémarrer kafka serveur.

Puisque sans le paramètre lisener, kafka utilisera Java.net.InetAddress.getCanonicalHostName()] _ pour obtenir l'adresse sur laquelle le serveur de socket écoute.

11
djzhu

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.

0
ethrbunny

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.

0
Douglas Lopez