为什么使用套接字源和多个接收器进行流式查询不起作用?

时间:2019-01-02 20:21:03

标签: apache-spark spark-structured-streaming

我正在尝试使用多个查询来写入Spark中的不同接收器。第一个查询有效,并且输出被写入接收器,但是第二个无效。

有人能指出我的错误吗?

val spark = SparkSession
  .builder
  .appName("StructuredNetworkWordCount")
  .getOrCreate()

import spark.implicits._
val source = spark.readStream
  .format("socket")
  .option("host", "localhost")
  .option("port", 9999)
  .load()
  .as[String]
  .map {e =>
    println(e)
    e
  }

// With Multiple Queries
val q1 = source.writeStream.outputMode("append").format("console")
  .trigger(Trigger.ProcessingTime(1000))
  .start()
println(q1)

val q2 = source.writeStream.outputMode("append")
  .format("csv")
  .option("path", "output.csv")
  .option("checkpointLocation", "/tmp/checkpoint/test")
  .trigger(Trigger.ProcessingTime(1000))
  .start()
println(q2)

spark.streams.awaitAnyTermination()

控制台接收器正在运行,但CSV接收器未写入输出。如果我更改顺序,则csv接收器将起作用,但不会起作用。

1 个答案:

答案 0 :(得分:3)

我假设您正在使用netcat或类似的实用程序来生成数据。此类实用程序的设计目的不是可重播的,并且不提供持久层,因此一旦使用,数据将被不可逆转地销毁。

因此,第二个流将监听更改,但是没有数据将到达它。