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();で実行する必要があります。
クエリプランを分岐しています:しようとしている同じ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()
私はこの問題に苦労しました。さまざまなブログから提案されたソリューションをそれぞれ試しました。しかし、私の場合、クエリで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();
指定された例外をスローし、ストリーミングドライバーを閉じます。
次のコードを使用して問題を修正しました。
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()
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|
+---+-----+-----+---------+------+
+---+-----+-----+---------+------+