簡體   English   中英

將 Spark 結構化流與 Trigger.Once 結合使用

[英]Using Spark Structured Streaming with Trigger.Once

有一個全天更新的 CSV 個文件的數據湖。 我正在嘗試使用此博客文章中概述Trigger.Once功能創建一個 Spark Structured Streaming 作業,以定期寫入已寫入 Parquet 數據湖中的 CSV 數據湖的新數據。

這是我所擁有的:

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

以下命令將所有數據寫入Parquet lake,但寫入所有數據后並沒有停止(我不得不手動取消作業)。

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

結構化流的主要目的是連續處理數據,而無需在新數據到達時啟動/停止流。 閱讀本文了解更多詳情。

從Spark 2.0.0開始, StreamingQuery具有processAllAvailable方法,該方法等待處理所有源數據並將其提交到接收器。 請注意,scala文檔聲明僅將此方法用於測試目的

因此代碼應如下所示(如果您仍然需要它):

query.processAllAvailable
query.stop

我得到了Structured Streaming + Trigger.Once在Parquet數據湖上正常工作。

我認為它不適用於CSV數據湖,因為CSV數據湖在嵌套目錄中有大量小文件。 Spark不喜歡使用小型CSV文件(我認為它需要打開它們來讀取標題)並且真的很討厭何時需要全局S3目錄。

所以我認為Spark Structured Streaming + Trigger.Once代碼很好 - 他們只需要讓CSV閱讀器技術更好。

該解決方案必須包括一個外部觸發器,如 AWS 事件或運行該作業的其他東西。 一旦 just 運行,它將獲取新的內容,查看檢查點。 您也可以使用 airflow 之類的東西按計划運行它。 Databricks 有一個作業調度程序。 所以你有兩個選擇

  1. 使用 airflow 或 databricks 作業調度程序等工具按每小時或每天一次的時間表運行。

  2. 使用 AWS s3 寫入事件之類的東西來觸發作業。

1) 的缺點是您可能會免費啟動集群並支付 $$。

2)的缺點是它更復雜。 您可以使用類似隊列的結構來確保這些消息不會丟失。 積極的是 databricks 有自動加載器,它可以為你完成所有這些對於某些來源。 自動加載器可以是連續流式傳輸或運行一次樣式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM