web-dev-qa-db-fra.com

Spark Streaming + Kafka: SparkException: impossible de trouver les décalages de chef pour Set

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:

  • Spark 1.5.2 (Apache)
  • Kafka 0.8.2.0 + kafka1.3.0 (CDH 5.4.7)
10
facha

Vous devez vérifier 2 choses:

  1. vérifiez si ce sujet et cette partition existent, dans votre cas, le sujet est test-topic et la partition est 0.

  2. 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 
7
Narendra Parmar

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]

3
Narongsak Mala

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.

1
user6399397

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.

1
Peter T.

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.

0
Vijay