本文描述使用 Delta Lake 時的最佳做法。
最佳做法概觀
以下是適用於大部分 Delta Lake 工作負載的一般建議:
- 使用 Unity Catalog 管理數據表。 請參閱 Azure Databricks 中,Unity Catalog 管理的 Delta Lake 和 Apache Iceberg 表格。
- 使用預測性優化。 請參閱 Unity Catalog 受控資料表的預測性最佳化。
- 使用液體群集。 請參閱 針對數據表使用液體叢集。
- 在相同位置刪除和重新建立資料表時,您應該一律使用
CREATE OR REPLACE TABLE陳述式。 請參閱 刪除或取代 Delta 資料表。
拿掉舊版 Delta 設定
Databricks 建議在升級至新的 Databricks Runtime 版本時,從 Spark 設定和資料表屬性中移除最明確的舊版 Delta 設定。 舊版設定可防止 Databricks 導入的新最佳化和預設值套用至已移轉的工作負載。
壓縮檔案
預測最佳化會自動在 Unity 目錄受控資料表上執行 OPTIMIZE 和 VACUUM 命令。 請參閱 Unity Catalog 受控資料表的預測性最佳化。
Databricks 建議經常執行 OPTIMIZE 命令來壓縮小型檔案。
注意
此作業不會移除舊檔案。 若要移除它們,請執行 VACUUM 命令。
請勿搭配 Delta Lake 使用 Spark 快取
Databricks 不建議您使用 Spark 快取,原因如下:
- 您會遺失任何略過的資料,這些資料可能來自在快取
DataFrame中新增的其他篩選。 - 如果資料表是使用不同的識別碼存取,則快取的資料可能不會更新。
Apache Spark 上 Delta Lake 與 Parquet 之間的差異
Delta Lake 會自動處理下列作業。 您絕對不應該手動執行這些作業:
-
REFRESH TABLE:差異資料表一律會傳回最新的資訊,因此不需要在變更之後手動呼叫REFRESH TABLE。 -
新增和移除資料分割:Delta Lake 會自動追蹤資料表中存在的資料分割集,並在新增或移除資料時更新清單。 因此,不需要執行
ALTER TABLE [ADD|DROP] PARTITION或MSCK。 -
載入單一分割區:不需要直接讀取分割區。 例如,您不需要執行
spark.read.format("parquet").load("/data/date=2017-01-01")。 請改用WHERE子句來略過資料,例如spark.read.table("<table-name>").where("date = '2017-01-01'")。 - 請勿手動修改數據檔: Delta Lake 使用交易日誌提交資料表的變更,確保其原子性。 請勿直接修改、新增或刪除 Delta 資料表中的 Parquet 資料文件,因為這可能會導致資料或資料表損毀。
改善 Delta Lake 合併的效能
您可以使用下列方法來減少合併所花費的時間:
減少相符項目的搜尋空間:根據預設,
merge作業會搜尋整個 Delta 資料表,以在來源資料表中尋找相符項目。 加快merge速度的其中一個方法是在比對條件中新增已知的條件約束來減少搜尋空間。 例如,假設您有一個由country和date分割的資料表,而且您想要使用merge來更新最後一天和特定國家/地區的資訊。 新增下列條件可讓查詢更快,因為它只會在相關的分割區中尋找相符項目:events.date = current_date() AND events.country = 'USA'此外,此查詢也會減少與其他並行作業衝突的機會。 如需詳細資料,請參閱 Azure Databricks 上的隔離等級和寫入衝突。
壓縮檔案:如果資料儲存在許多小型檔案中,讀取要搜尋相符項目的資料可能會變慢。 您可以將小型檔案壓縮成較大的檔案,以改善讀取輸送量。 請參閱最佳化資料檔結構描述。
控制寫入的隨機分割區:
merge作業會多次重新排列資料,以計算和寫入更新的資料。 用於資料重排的任務數量是由 Spark 會話設定spark.sql.shuffle.partitions所控制。 設定此參數不僅會控制平行處理原則,也會決定輸出檔案的數目。 增加該值會提高並行性,但也會產生更多較小的資料檔案。啟用最佳化的寫入:針對資料分割資料表,
merge可以產生比洗牌分區數目更多的小型檔案。 這是因為每個洗牌任務都可以在多個分割區中寫入多個檔案,而且可能會成為效能瓶頸。 您可以啟用最佳化的寫入來減少檔案數目。 請參閱 在 Azure Databricks 上 Delta Lake 的寫入優化。調整資料表中的檔案大小:Azure Databricks 可以自動偵測 Delta 資料表是否有經常
merge重寫檔案的作業,而且可能會選擇減少重寫檔案的大小,以預期未來會進一步重寫檔案。 如需詳細資訊,請參閱<微調檔案大小>一節。低隨機合併:低隨機合併提供
MERGE的最佳化實作,為最常見的工作負載提供更好的效能。 此外,它會保留現有的資料結構描述最佳化,例如 未修改資料上的 Z 順序。