DBFS 和 Unity Catalog 的最佳實踐
Unity 目錄引進了一些新組態和概念,以與 DBFS 完全不同的方式處理數據控管。 本文概述使用 Unity Catalog 外部位置和 DBFS 的幾項最佳做法。
Databricks 建議不要在已啟用 Unity Catalog 的 Azure Databricks 工作區中,針對大部分使用案例使用 DBFS 和掛接的雲端物件儲存。 本文說明您應該使用掛接的雲端物件記憶體的一些案例。 請注意,除非您必須將儲存在該處的檔案或數據遷移至 Unity 目錄,否則 Databricks 不建議搭配 Unity 目錄使用 DBFS 根目錄。
問:在啟用了 Unity 目錄的工作區中,如何使用 DBFS?
針對 hive_metastore
數據表執行的動作會使用舊版數據存取模式,這可能包括 DBFS 所管理的數據和記憶體認證。 工作區範圍 hive_metastore
中的受控數據表會儲存在 DBFS 根目錄中。
DBFS 如何以單一使用者存取模式運作?
以單一使用者存取模式設定的叢集具有 DBFS 的完整存取權,包括 DBFS 根目錄中的所有檔案和掛接的數據。
DBFS 如何以共用存取模式運作?
共用存取模式結合了 Unity 目錄數據控管與 Azure Databricks 舊版數據表 ACL。
hive_metastore
中的數據存取權僅適用於明確授與許可權的使用者。
若要使用 DBFS 直接與檔案互動,您必須授與 ANY FILE
許可權。 由於 ANY FILE
允許使用者略過 hive_metastore
中的舊版數據表 ACL,並存取 DBFS 管理的所有數據,因此 Databricks 在授與此許可權時建議小心。
請勿將 DBFS 與 Unity Catalog 外部位置一起使用
Unity Catalog 使用完整的雲端 URI 路徑來保護對外部位置資料的存取權,透過識別受控物件儲存目錄上的授權。 DBFS 掛載點使用完全不同的數據存取模型,完全略過 Unity Catalog 目錄。 Databricks 建議您不要在 DBFS 掛接和 UC 外部磁碟區之間重用雲端物件存儲卷,包括在跨工作區或帳戶共用數據時。
保護您的 Unity 目錄受控記憶體
Unity Catalog 使用受控儲存位置來儲存受控表格和磁碟區的資料檔。
Databricks 針對受管理的儲存位置推薦以下做法:
- 使用新的儲存帳戶或儲存桶。
- 定義 Unity 目錄的自定義身分識別原則。
- 限制對 Unity 目錄所管理之 Azure Databricks 的所有存取。
- 限制針對 Unity 目錄建立之身分識別存取原則的所有存取。
將現有數據新增至外部位置
您可以使用外部位置,將現有的記憶體帳戶載入 Unity 目錄。 為了獲得最大的安全性,Databricks 建議在撤銷所有其他記憶體認證和存取模式之後,只將記憶體帳戶載入外部位置。
您絕對不應該將用作 DBFS 根目錄的儲存帳戶載入為 Unity 目錄中的外部位置。
Unity 目錄檔系統存取會忽略叢集組態
Unity 目錄不會遵守文件系統設定的叢集組態。 這表示使用 Unity 目錄存取資料時,使用雲端物件記憶體設定自定義行為的 Hadoop 檔案系統設定無法運作。
多重路徑存取的限制
一般而言,您可以同時使用 Unity Catalog 和 DBFS,但在相同命令或筆記本單元格中,無法以不同的存取方法參考相等或共用父子關聯的路徑。
例如,如果在位置 foo
的 hive_metastore
中定義外部數據表 a/b/c
,並且在 a/b/
上的 Unity Catalog 中定義了一個外部位置,下列程式碼將拋出錯誤:
spark.read.table("foo").filter("id IS NOT NULL").write.mode("overwrite").save("a/b/c")
如果此邏輯分成兩個資料格,就不會發生此錯誤:
df = spark.read.table("foo").filter("id IS NOT NULL")
df.write.mode("overwrite").save("a/b/c")