問題
您正在運行的一係列結構化流工作和寫入文件。每10日似乎跑慢於前麵的工作。
導致
文件創建一個_spark_metadata目標路徑的文件夾。這個元數據文件夾存儲每一批信息,包括哪些文件批處理的一部分。這是需要提供一個僅一次保證文件流。默認情況下,在每一個10批,前麵九批數據文件壓縮成一個文件/ <目標文件夾> /數據/ _spark_metadata / 9.緊湊。
解決方案
有三個可能的解決方案。選擇一個最適合您的情況。
- 選項1:減輕了問題在生產環境中,用最少的代碼更改,但保留較少的元數據。
- 選項2:推薦如果你可以切換到使用增量表。這是一個很好的長期的解決方案。
- 選項3:建議如果管道不需要隻有一次語義或下遊可以處理重複。
選項1:元數據保留時間縮短
默認文件夾的元數據隨時間增大。為了減輕這個,你可以設置一個最大限度的保留時間為輸出文件。文件超過保存期自動排除在外,這限製了在元數據文件夾中文件的數量。更少的元數據文件夾中的文件意味著壓縮花費更少的時間。
設置停留時間當你寫流DataFrame文件沉:
% python check_point = ' < checkpoint-folder-path > ' target_path = <目標路徑>的保留= <保留時間> #你可以提供的值作為字符串格式在幾小時或幾天的時間。例如,“12小時”,“7 d”等等。這個值默認為禁用df.writeStream.format (json) .mode(“追加”)。選項(“checkPointLocation”, check_point)。選項(“路徑”,目標路徑)。選項(“保留”,保留).start ()
選項2:使用一個增量表水槽
δ表不使用spark_metadata文件夾,它們提供了僅一次語義。
有關更多信息,請查看文檔使用增量表作為接收器(AWS|Azure|GCP)。
選項3:使用foreachBatch
foreachBatch不創建一個spark_metadata文件夾寫作時的下沉。