web-dev-qa-db-fra.com

Les requêtes avec des sources de streaming doivent être exécutées avec writeStream.start ();

J'essaie de lire les messages de Kafka (version 10) avec spark et d'essayer de l'imprimer.

     import spark.implicits._

         val spark = SparkSession
              .builder
              .appName("StructuredNetworkWordCount")
              .config("spark.master", "local")
              .getOrCreate()  

            val ds1 = spark.readStream.format("kafka")
    .option("kafka.bootstrap.servers", "localhost:9092")  
.option("subscribe", "topicA")  .load()
          ds1.collect.foreach(println)
         ds1.writeStream
           .format("console")
           .start()
          ds1.printSchema()

obtenir une erreur Exception dans le fil "main" 

org.Apache.spark.sql.AnalysisException: Requêtes avec des sources en streaming doit être exécuté avec writeStream.start () ;;

13
shivali

j'ai résolu le problème en utilisant le code suivant. 

 val df = session
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", brokers)
  .option("subscribe", "streamTest2")
  .load();

    val query = df.writeStream
  .outputMode("append")
  .format("console")
  .start()
query.awaitTermination()
4
Rajeev Rathor

J'ai beaucoup lutté avec ce problème. J'ai essayé chacune des solutions suggérées sur divers blogs . Mais, dans mon cas, il existe peu d'instructions entre les appels à start () sur une requête et enfin, j'appelais enfin la fonction waitTerminate () qui cause ce problème.

S'il vous plaît essayez de cette façon, cela fonctionne parfaitement pour moi . Exemple de travail:

val query = df.writeStream
      .outputMode("append")
      .format("console")
      .start().awaitTermination();

Si vous écrivez de cette manière, cela provoquera une exception/erreur:

val query = df.writeStream
      .outputMode("append")
      .format("console")
      .start()

    // some statement 
    // some statement 

    query.awaitTermination();

jettera une exception donnée et fermera votre pilote de streaming.

3
Rajeev Rathor

Veuillez supprimer les fonctions ds1.collect.foreach(println) et ds1.printSchema(), utiliser outputMode et awaitAnyTermination pour le traitement en arrière-plan. Attendre la fin de l'une des requêtes sur le spark.streams associé

val spark = SparkSession
    .builder
    .appName("StructuredNetworkWordCount")
    .config("spark.master", "local[*]")
    .getOrCreate()

  val ds1 = spark.readStream.format("kafka")
    .option("kafka.bootstrap.servers", "localhost:9092")
    .option("subscribe", "topicA")  .load()

  val consoleOutput1 = ds1.writeStream
     .outputMode("update")
     .format("console")
     .start()

  spark.streams.awaitAnyTermination()

|key|value|topic|partition|offset|
+---+-----+-----+---------+------+
+---+-----+-----+---------+------+
1
shrikrishna