從雲端物件儲存讀取資料的速度比從本地磁碟讀取慢。 若不使用快取,會反覆讀取相同 Parquet 資料檔案的查詢與筆記本每次都會從雲端物件儲存中擷取這些檔案。
Azure Databricks 利用磁碟快取來加快資料讀取速度。 當節點從遠端儲存擷取 Parquet 資料檔案時,會自動在其本機儲存體上以快速中間格式儲存一份副本。 相同資料的後續讀取則在本地執行,速度明顯快很多。 快取適用於所有 Parquet 資料檔案,包括 Delta Lake 資料表。
注意
在 SQL 倉儲和 Databricks Runtime 14.2 和更新版本中,CACHE SELECT 命令會被忽略。 會改用增強的磁碟快取演算法。
最佳做法
磁碟快取最有助於處理重複讀取相同資料的工作負載,例如對同一資料表進行重複或迭代查詢。 Azure Databricks 會自動在支援此功能的工作者實例類型上啟用此功能。 為了幫助磁碟快取加快讀取速度,請遵循以下做法:
- 選擇支援磁碟快取的工作器執行個體類型。 請參閱 選取實例類型以使用磁碟快取。
- 重複讀取 Parquet 和 Delta Lake 資料時,請使用磁碟快取取代 Apache Spark 快取。 請參見 「比較磁碟快取與 Spark 快取」。
已將差異快取重新命名為磁碟快取
Azure Databricks 上的磁碟快取先前稱為 Delta 快取和 DBIO 快取。 磁碟快取行為是專屬的 Azure Databricks 功能。 此名稱變更旨在消除外界誤以為它是 Delta Lake 通訊協定一部分的混淆。
比較磁碟快取和 Spark 快取
Azure Databricks 磁盘快取與 Apache Spark 快取不同。 Databricks 建議使用自動磁碟快取。
下表摘要說明磁碟與 Apache Spark 快取之間的主要差異,以便您為工作流程選擇最佳工具:
| 功能 | 磁碟快取 | Apache Spark 快取 |
|---|---|---|
| 儲存為 | 工作節點上的本機檔案。 | 記憶體中的區塊,但這取決於儲存層級。 |
| 套用至 | 儲存在 ABFS 和其他文件系統上的任何 Parquet 資料表。 | 任何 DataFrame 或 RDD。 |
| 觸發 | 自動在第一次讀取時(如果已啟用快取)。 | 手動方式需要變更程式碼。 |
| 已評估 | 懶散地。 | 懶散地。 |
| 可用性 | 某些節點類型預設啟用。 你可以用設定旗標來啟用或停用它。 | 隨時可用。 |
| 已移除 | 以 LRU 方式自動,或在任何檔案變更時;在重新啟動叢集時則手動。 | 自動採用 LRU 方式,手動則使用 unpersist。 |
磁碟快取一致性
磁碟快取會自動偵測資料檔案何時被建立、刪除、修改或覆寫,並據以更新其內容。 您可以撰寫、修改和刪除數據表的資料,並且不需要特意使快取資料失效。 任何過時的項目都會自動失效,並從快取中移除。
選取實例類型以使用磁碟快取
建議的(也是最簡單的)使用磁碟快取方式,是在設定叢集時選擇包含 SSD 磁碟區的工作類型。 這類背景工作程序已啟用並設定為使用磁碟快取。
磁碟快取已設定為在提供給工作節點的本機 SSD 上使用最多一半的空間。 如需設定選項,請參閱 設定磁碟快取。
設定磁碟快取
Databricks 建議你為運算選擇快取加速的工作者實例類型。 這類實例會自動針對磁碟快取進行最佳設定。
注意
當工作節點除役時,儲存在該工作節點上的 Spark 快取會遺失。 因此,如果啟用自動調整功能,快取會出現一些不穩定情況。 接著,Spark 必須視需要從來源重新讀取遺漏的數據分割。
設定磁碟使用量
要設定磁碟快取如何使用工作節點的本地儲存,請在叢集建立時指定以下 Spark 設定 :
-
spark.databricks.io.cache.maxDiskUsage:每個節點為快取資料保留的磁碟空間(以位元組為單位) -
spark.databricks.io.cache.maxMetaDataCache:每個節點為快取中繼資料保留的磁碟空間(以位元組為單位) -
spark.databricks.io.cache.compression.enabled:快取的數據應該以壓縮格式儲存
設定範例:
spark.databricks.io.cache.maxDiskUsage 50g
spark.databricks.io.cache.maxMetaDataCache 1g
spark.databricks.io.cache.compression.enabled false
啟用或停用磁碟快取
要查看磁碟快取目前的設定,請執行:
spark.conf.get("spark.databricks.io.cache.enabled")
若要啟用和停用磁碟快取,請執行:
spark.conf.set("spark.databricks.io.cache.enabled", "[true | false]")
停用快取並不會導致刪除已在本機儲存空間中的資料。 相反地,它會防止查詢將新數據新增至快取,以及從快取讀取數據。