[英]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 有一個作業調度程序。 所以你有兩個選擇
使用 airflow 或 databricks 作業調度程序等工具按每小時或每天一次的時間表運行。
使用 AWS s3 寫入事件之類的東西來觸發作業。
1) 的缺點是您可能會免費啟動集群並支付 $$。
2)的缺點是它更復雜。 您可以使用類似隊列的結構來確保這些消息不會丟失。 積極的是 databricks 有自動加載器,它可以為你完成所有這些對於某些來源。 自動加載器可以是連續流式傳輸或運行一次樣式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.