【问题标题】:Using Spark Structured Streaming with Trigger.Once将 Spark 结构化流与 Trigger.Once 结合使用
【发布时间】:2018-01-24 02:29:49
【问题描述】:

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

这是我所拥有的:

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 文件然后停止?

【问题讨论】:

  • “没有停止”是什么意思?这是一个流媒体作业,它不应该停止,只是每天触发一次
  • @YuvalItzchakov- 我想启动一个集群,将 CSV 湖中的新数据写入 Parquet 湖,然后关闭集群。我假设 writeStream 进程会停止。在 Databricks 博客文章 (databricks.com/blog/2017/05/22/…) 中,“使用 Databricks 调度运行”部分的图片显示了具有设定持续时间和成功状态的作业。如果 writeStream 作业继续运行,则集群不会关闭。我想我一定错过了什么。
  • 你没有遗漏任何东西,我查看了代码,似乎查询应该在执行单个作业后终止。
  • 我无法复制它。你能用本地文件系统创建一个复制器吗?
  • @Powers 我也面临同样的问题。理想情况下,流式查询应该在作业完成后停止。但是,它并没有停止。事实上,它一直在运行,并且还保持连接打开。

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


【解决方案1】:

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

我认为它不适用于 CSV 数据湖,因为 CSV 数据湖在嵌套目录中有大量小文件。 Spark 不喜欢处理小型 CSV 文件(我认为它需要将它们全部打开才能读取标题)并且非常讨厌需要全局 S3 目录。

所以我认为 Spark Structured Streaming + Trigger.Once 代码很好 - 他们只需要改进 CSV 阅读器技术。

【讨论】:

【解决方案2】:

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

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

因此代码应该是这样的(如果你还想要的话):

query.processAllAvailable
query.stop

【讨论】:

  • 这样做是有目的的。当你想省钱,因为有一个空闲的集群是在扔钱,那么触发Once就变得非常有价值
猜你喜欢
  • 2021-03-14
  • 1970-01-01
  • 2017-01-09
  • 2019-03-03
  • 1970-01-01
  • 2017-05-04
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多