web-dev-qa-db-ja.com

ストリーミングソースを使用したクエリは、writeStream.start()を使用して実行する必要があります。

kafka(バージョン10)のsparkからメッセージを読み取って印刷しようとしています。

     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()

スレッド「メイン」でエラー例外を取得

org.Apache.spark.sql.AnalysisException:ストリーミングソースを使用したクエリは、writeStream.start();で実行する必要があります。

14
shivali

クエリプランを分岐しています:しようとしている同じds1から:

  • ds1.collect.foreach(...)
  • ds1.writeStream.format(...){...}

ただし、2番目のブランチで.start()のみを呼び出し、他のダングリングを終了せずに残します。

解決策は、両方のブランチを開始し、終了を待つことです。

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

ds1.printSchema()
query1.awaitTermination()
query2.awaitTermination()
14
ssice

私はこの問題に苦労しました。さまざまなブログから提案されたソリューションをそれぞれ試しました。しかし、私の場合、クエリでstart()を呼び出す間にステートメントがほとんどなく、最後にこれを引き起こすawaitTerminate()関数を呼び出していました。

この方法で試してください、それは私にとって完全に働いています。作業例:

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

このように書くと、例外/エラーが発生します:

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

    // some statement 
    // some statement 

    query.awaitTermination();

指定された例外をスローし、ストリーミングドライバーを閉じます。

4
Rajeev Rathor

次のコードを使用して問題を修正しました。

 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

ds1.collect.foreach(println)およびds1.printSchema()を削除し、バックグラウンドプロセスにoutputModeおよびawaitAnyTerminationを使用します。関連するspark.streamsは終了しました

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
SLU