J'essaie de configurer Spark Streaming pour qu'il reçoive des messages de la file d'attente Kafka. Je reçois l'erreur suivante:
py4j.protocol.Py4JJavaError: An error occurred while calling o30.createDirectStream.
: org.Apache.spark.SparkException: Java.nio.channels.ClosedChannelException
org.Apache.spark.SparkException: Couldn't find leader offsets for Set([test-topic,0])
at org.Apache.spark.streaming.kafka.KafkaCluster$$anonfun$checkErrors$1.apply(KafkaCluster.scala:366)
at org.Apache.spark.streaming.kafka.KafkaCluster$$anonfun$checkErrors$1.apply(KafkaCluster.scala:366)
at scala.util.Either.fold(Either.scala:97)
Voici le code que j'exécute (pyspark):
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
directKafkaStream = KafkaUtils.createDirectStream(ssc, ["test-topic"], {"metadata.broker.list": "Host.domain:9092"})
ssc.start()
ssc.awaitTermination()
Il y avait quelques messages similaires avec la même erreur. Dans tous les cas, la cause était le sujet vide de Kafka. Il y a des messages dans mon "sujet de test". Je peux les sortir avec
kafka-console-consumer --zookeeper Host.domain:2181 --topic test-topic --from-beginning --max-messages 100
Est-ce que quelqu'un sait ce qui pourrait être le problème?
J'utilise:
Vous devez vérifier 2 choses:
vérifiez si ce sujet et cette partition existent, dans votre cas, le sujet est test-topic
et la partition est 0.
en fonction de votre code, vous essayez de consommer le message de l'offset 0 et il est possible que le message ne soit pas disponible à partir de l'offset 0, vérifiez quel est votre offset le plus ancien et essayez de consommer à partir de là.
Ci-dessous, la commande pour vérifier le premier décalage:
sh kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list "your broker list" --topic "topic name" --time -1
1) Vous devez vous assurer que vous avez déjà créé le sujet test-topic
Exécuter la commande suivante pour vérifier la liste du sujet
kafka-topics.sh --list --zookeeper [Host or ip of zookeeper]:[port]
2) Après avoir vérifié votre sujet, vous devez configurer votre configuration de Kafka dans la section Socket Server Settings
listeners=PLAINTEXT://[Host or ip of Kafka]:[port]
Si vous définissez des noms d'hôte abrégés dans/etc/hosts et les utilisez dans les configurations de vos serveurs kafka, vous devez les remplacer par ip Ou enregistrez le même nom d'hôte abrégé sur votre ordinateur local ou dans le répertoire/etc/hosts du client.
Une erreur s'est produite car la librairie de diffusion Spark ne peut pas résoudre le nom d'hôte abrégé sur le PC ou le client.
Une autre option pour forcer la création d'un sujet s'il n'existe pas. Vous pouvez le faire en définissant la propriété "auto.create.topics.enable" sur "true" dans la carte kafkaParams comme ceci.
val kafkaParams = Map[String, String](
"bootstrap.servers" -> kafkaHost,
"group.id" -> kafkaGroup,
"auto.create.topics.enable" -> "true")
Utilisation des versions Scala 2.11 et Kafka 0.10.
Une des raisons de ce type d'erreur où leader est introuvable pour la rubrique spécifiée est Problème avec la configuration de serveur Kafka.
Ouvrez les configurations de votre serveur Kafka:
vim ./kafka/kafka-<your-version>/config/server.properties
Dans la section "Paramètres du serveur de sockets", fournissez l'adresse IP de votre hôte si elle manque:
listeners=PLAINTEXT://{Host-ip}:{Host-port}
J'utilisais la configuration Kafka fournie avec le bac à sable MapR et tentais d'accéder à la kafka via un code à étincelle. J'avais la même erreur en accédant à mon kafka car il manquait l'adresse IP de ma configuration.