具有火花流的多个writeStream

时间:2018-07-18 11:31:17

标签: apache-spark spark-structured-streaming

我正在使用Spark Streaming,并且在尝试实现多个写入流时遇到一些问题。 下面是我的代码

DataWriter.writeStreamer(firstTableData,"parquet",CheckPointConf.firstCheckPoint,OutputConf.firstDataOutput)
DataWriter.writeStreamer(secondTableData,"parquet",CheckPointConf.secondCheckPoint,OutputConf.secondDataOutput)
DataWriter.writeStreamer(thirdTableData,"parquet", CheckPointConf.thirdCheckPoint,OutputConf.thirdDataOutput)

其中writeStreamer的定义如下:

def writeStreamer(input: DataFrame, checkPointFolder: String, output: String) = {

  val query = input
                .writeStream
                .format("orc")
                .option("checkpointLocation", checkPointFolder)
                .option("path", output)
                .outputMode(OutputMode.Append)
                .start()

  query.awaitTermination()
}

我面临的问题是,只有第一个表是用spark writeStream编写的,其他所有表都没有任何反应。 您对此有任何想法吗?

3 个答案:

答案 0 :(得分:1)

query.awaitTermination()应该在创建最后一个流之后 之后完成。

可以修改

writeStreamer函数以返回一个StreamingQuery而不是那时的awaitTermination(因为它是阻塞):

def writeStreamer(input: DataFrame, checkPointFolder: String, output: String): StreamingQuery = {
  input
    .writeStream
    .format("orc")
    .option("checkpointLocation", checkPointFolder)
    .option("path", output)
    .outputMode(OutputMode.Append)
    .start()
}

那么您将拥有:

val query1 = DataWriter.writeStreamer(...)
val query2 = DataWriter.writeStreamer(...)
val query3 = DataWriter.writeStreamer(...)

query3.awaitTermination()

答案 1 :(得分:0)

  

默认情况下,并发作业数为1,这意味着一次   只有1个作业处于活动状态

您是否尝试在Spark conf中增加可能的并发作业数量?

sparkConf.set("spark.streaming.concurrentJobs","3")

不是官方消息:http://why-not-learn-something.blogspot.com/2016/06/spark-streaming-performance-tuning-on.html

答案 2 :(得分:0)

如果要执行写入程序以并行运行,则可以使用

sparkSession.streams.awaitAnyTermination()

并从writeStreamer方法中删除query.awaitTermination()