使用Spark Structured Streaming和Trigger.Once

时间:2017-08-16 04:38:38

标签: scala apache-spark spark-structured-streaming

有一个CSV文件的数据湖全天更新。我正在尝试使用Trigger.Once功能outlined in this blog post创建Spark结构化流工作,以定期将已写入CSV数据湖的新数据写入Parquet数据湖。

这就是我所拥有的:

val df = spark
  .readStream
  .schema(s)
  .csv("s3a://csv-data-lake-files")

以下命令将所有数据写入Parquet湖,但在写完所有数据后没有停止(我必须手动取消作业)。

processedDf
  .writeStream
  .trigger(Trigger.Once)
  .format("parquet")
  .option("checkpointLocation", "s3-path-to-checkpoint")
  .start("s3-path-to-parquet-lake")

以下工作也有效,但在所有数据写完后都没有停止(我不得不手动取消工作):

val query = processedDf
  .writeStream
  .trigger(Trigger.Once)
  .format("parquet")
  .option("checkpointLocation", "s3-path-to-checkpoint")
  .start("s3-path-to-parquet-lake")

query.awaitTermination()

以下命令在写入任何数据之前停止了查询。

val query = processedDf
  .writeStream
  .trigger(Trigger.Once)
  .format("parquet")
  .option("checkpointLocation", "s3-path-to-checkpoint")
  .start("s3-path-to-parquet-lake")

query.stop()

如何配置writeStream查询以等待所有增量数据写入Parquet文件然后停止?

2 个答案:

答案 0 :(得分:1)

结构化流式传输的主要目的是连续处理数据,而无需在新数据到达时启动/停止流。请阅读this了解详情。

从Spark 2.0.0 StreamingQuery开始,方法processAllAvailable等待处理所有源数据并将其提交到接收器。请注意,scala docs states to use this method for testing purpose only

因此,代码应如下所示(如果您仍然需要):

query.processAllAvailable
query.stop

答案 1 :(得分:1)

我得到了结构化流+触发器。一旦在Parquet数据湖上正常工作。

我认为它不适用于CSV数据湖,因为CSV数据湖在嵌套目录中有大量小文件。 Spark不喜欢使用小型CSV文件(我认为需要将它们全部打开以读取标题),并且真的讨厌何时需要遍历S3目录。

因此,我认为Spark结构化流+触发器。代码很好-他们只需要使CSV阅读器技术更好即可。