web-dev-qa-db-fra.com

Exécution de LeaderNotAvailableException lors de l'utilisation de Kafka 0.8.1 avec Zookeeper 3.4.6

J'ai installé la version stable de kafka (0.8.1 avec 2.9.2 Scala) conformément à leur site Web et je l'exécute avec un ensemble de zookeepers à 3 nœuds (3.4.6). J'ai essayé de créer un sujet de test, mais je constate régulièrement qu'aucun chef n'est attribué à la partition du sujet:

[kafka_2.9.2-0.8.1]$ ./bin/kafka-topics.sh --zookeeper <zookeeper_ensemble> --describe --topic test-1
Topic:test-1    PartitionCount:1    ReplicationFactor:3 Configs:
    Topic: test-1   Partition: 0    **Leader: none**    Replicas: 0,1,2 **Isr:** 

J'ai quand même essayé d'écrire dans le sujet en utilisant le producteur de console, mais je suis tombé sur l'exception LeaderNotAvailableException:

[kafka_2.9.2-0.8.1]$ ./kafka-console-producer.sh --broker-list <broker_list> --topic test-1

hello world

[2014-04-22 11:58:48,297] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,321] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,322] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,445] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,467] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,467] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,590] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,612] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,612] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,731] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,753] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,754] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test-1 (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,876] WARN Error while fetching metadata [{TopicMetadata for topic test-1 -> 
No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException}] for topic [test-1]: class kafka.common.LeaderNotAvailableException  (kafka.producer.BrokerPartitionInfo)

[2014-04-22 11:58:48,877] ERROR Failed to send requests for topics test-1 with correlation ids in [0,8] (kafka.producer.async.DefaultEventHandler)

[2014-04-22 11:58:48,878] ERROR Error in handling batch of 1 events (kafka.producer.async.ProducerSendThread)
kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    at kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:90)
    at kafka.producer.async.ProducerSendThread.tryToHandle(ProducerSendThread.scala:104)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:87)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:67)
    at scala.collection.immutable.Stream.foreach(Stream.scala:547)
    at kafka.producer.async.ProducerSendThread.processEvents(ProducerSendThread.scala:66)
    at kafka.producer.async.ProducerSendThread.run(ProducerSendThread.scala:44)

Je devrais également préciser que cela fonctionnait initialement pendant quelques jours, puis que tout sujet créé présentait ce problème de leader manquant.

66
user3561789

Kafka utilise un cadre de coordination externe (par défaut, Zookeeper) pour maintenir la configuration. Il semble que la configuration ne soit plus synchronisée avec les données du journal Kafka. Dans ce cas, je supprimerais les données de sujet affectées et les données Zookeeper associées. 

Pour l'environnement de test:

  1. Arrêtez Kafka-server et Zookeeper-server
  2. Supprimez les répertoires de données des deux services. Par défaut, ils sont /tmp/kafka-log et /tmp/zookeeper.
  3. Recommencez Kafka-server et Zookeeper-server
  4. Créer un nouveau sujet

Vous pouvez maintenant travailler à nouveau sur le sujet.

Pour l'environnement de production:

Comme les sujets Kafka sont stockés dans des répertoires différents, vous devez supprimer des répertoires particuliers. Vous devez également supprimer /brokers/{broker_id}/topics/{broken_topic} de Zookeeper en utilisant un client Zookeeper. 

Veuillez lire attentivement la documentation de Kafka pour vous assurer de la structure de configuration avant de faire quelque chose de stupide. Kafka est en train de déployer une fonctionnalité de suppression de sujet ( KAFKA-330 ), afin de résoudre plus facilement le problème.

48
stanleyxu2005

J'ai eu le même problème. Il s'avère que Kafka a besoin que le nom d'hôte de la machine soit résolu pour pouvoir se reconnecter.

J'ai mis à jour le nom d'hôte sur ma machine et, après un redémarrage de zookeeper et de kafka, le sujet pourrait être écrit correctement.

19
Lee Netherton

J'avais résolu ce problème en ajoutant une entrée dans /etc/hosts pour 127.0.0.1 avec un nom d'hôte qualifié complet:

127.0.0.1       x4239433.your.domain.com x4239433

Le producteur et le consommateur ont commencé à bien fonctionner.

10
borodark

J'ai eu le même problème. En fin de compte, j'ai dû supprimer, arrêter/arrêter les nœuds Kafka, puis suivre les conseils fournis sur la suppression des sujets Kafka . Une fois que je me suis débarrassé des sujets brisés, j'ai pu relancer Kafka avec succès. 

J'aimerais savoir s'il existe une meilleure approche et comment éviter que cela ne se produise à l'avenir. 

7
Mark Butler

J'ai eu le même problème, résolu le JDK de 1.7 à 1.6

2
user3603968

Donc, une autre réponse possible - l'adresse IP dans le advertised.hostname dans le kafka config/server.properties peut être mal typée avec un espace supplémentaire.

Dans mes cas

advertised.Host.name=10.123.123.211_\n (where _ is an extra space)

au lieu du correct

advertised.Host.name=10.123.123.211\n

Pour une raison quelconque, cela fonctionnait pendant 6 mois sans problèmes, et probablement une mise à jour de la bibliothèque a supprimé la recherche informelle de l'adresse IP réduisant l'espace supplémentaire.

Un simple correctif du fichier de configuration et le redémarrage de kafka résolvent ce problème.

2
Soren

C'est le problème avec JDK.

J'ai installé openjdk

Java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

Mais j'ai changé cela pour Oracle jdk (suivez ce lien: http://www.webupd8.org/2012/06/how-to-install-Oracle-Java-7-in-debian.html )

Java version "1.7.0_80" Java(TM) SE Runtime Environment (build
1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

Maintenant cela fonctionne bien. J'espère que cela t'aides.

2
Ashwini Adlakha

eu le même problème. Assurez-vous d’avoir au moins un sujet sur chaque partition utilisée par votre consommateur/producteur. Zookeeper ne trouvera pas le responsable d'une partition s'il n'y a pas de sujets utilisant cette partition

2
Andrew

Je rencontrais exactement le même problème lorsque je tentais de jouer avec Kafka dans mon système local (mac OS X El Capitan). Le problème était avec mon gardien de zoo, il ne faisait pas référence au fichier de configuration correct . Redémarrez le gardien de zoo, puis Kafka et exécutez la commande suivante. vérifier si Leader n'est pas Aucun. Si Leader est aucun, supprimez ce sujet et recréez-le.

kafka-topics --zookeeper localhost:2181 --describe --topic pytest

La sortie sera comme

Topic:pytest    PartitionCount:1    ReplicationFactor:1 Configs:
Topic: pytest   Partition: 0    Leader: 0   Replicas: 0 Isr: 0

J'espère que cela devrait aider.

0
suyash

J'ai fait face au problème avec Kafka, Zookeeper pod dans Openshift et le Kafka était compatible TLS. J'ai dû ajouter les variables d'environnement ci-dessous à Kafka,

  • KAFKA_ZOOKEEPER_CONNECT

  • KAFKA_SSL_KEYSTORE_LOCATION

  • KAFKA_SSL_TRUSTSTORE_LOCATION

  • KAFKA_SSL_KEYSTORE_PASSWORD

  • KAFKA_SSL_TRUSTSTORE_PASSWORD

  • KAFKA_ADVERTISED_LISTENERS

  • KAFKA_INTER_BROKER_LISTENER_NAME

  • KAFKA_LISTENERS

Et après avoir défini les variables, je devais supprimer et recréer les pods, pour que cela fonctionne.

0
Kannan Ramamoorthy

Ajoutez "advertised.Host.name = localhost" dans config/server.properties et redémarrez le serveur Kafka. Ça a fonctionné pour moi

0
Reddeiah Pidugu