在 Azure Databricks 上掛接雲端物件儲存體

Azure Databricks 可讓使用者將雲端物件記憶體掛接至 Databricks 文件系統 (DBFS),以簡化不熟悉雲端概念的用戶的數據存取模式。 掛接的數據不適用於 Unity 目錄,Databricks 建議移轉不使用掛接,而是使用 Unity 目錄管理數據控管。

Azure Databricks 如何掛接雲端物件記憶體?

Azure Databricks 掛接會建立工作區與雲端物件記憶體之間的連結,可讓您使用與 Databricks 檔系統相關的熟悉檔案路徑來與雲端物件記憶體互動。 掛接的運作方式是建立目錄下的 /mnt 本機別名,以儲存下列資訊:

  • 雲端物件記憶體的位置。
  • 連線到記憶體帳戶或容器的驅動程序規格。
  • 存取數據所需的安全性認證。

掛接記憶體的語法為何?

source指定物件記憶體的 URI(而且可以選擇性地編碼安全性認證)。 指定 mount_point 目錄中的 /mnt 本機路徑。 某些物件儲存來源支持選擇性 encryption_type 自變數。 針對某些存取模式,您可以將其他組態規格當做字典傳遞至 extra_configs

注意

Databricks 建議使用 extra_configs將掛接特定的 Spark 和 Hadoop 組態設定為選項。 這可確保組態會系結至掛接,而不是叢集或會話。

dbutils.fs.mount(
  source: str,
  mount_point: str,
  encryption_type: Optional[str] = "",
  extra_configs: Optional[dict[str:str]] = None
)

在設定或改變數據掛接之前,請先洽詢您的工作區和雲端系統管理員,因為設定不正確,可為工作區中的所有使用者提供不安全的存取權。

注意

除了本文所述的方法之外,您還可以使用 Databricks Terraform 提供者 自動掛接貯體,並 databricks_mount

卸載入點

若要卸載裝入點,請使用下列命令:

dbutils.fs.unmount("/mnt/<mount-name>")

警告

若要避免錯誤,請勿在其他作業讀取或寫入時修改裝入點。 修改掛接之後,請一律在所有其他執行中的叢集上執行 dbutils.fs.refreshMounts() ,以傳播任何掛接更新。 請參閱 refreshMounts 命令 (dbutils.fs.refreshMounts)

使用 ABFS 掛接 ADLS Gen2 或 Blob 儲存體

您可以使用 Microsoft Entra ID(先前稱為 Azure Active Directory)應用程式服務主體,在 Azure 記憶體帳戶中掛接數據以進行驗證。 如需詳細資訊,請參閱 使用服務主體存取記憶體和 Microsoft Entra ID(Azure Active Directory)

重要

  • Azure Databricks 工作區中的所有使用者都可以存取掛接的 ADLS Gen2 帳戶。 您用來存取 ADLS Gen2 帳戶的服務主體應該只授與該 ADLS Gen2 帳戶的存取權;它不應該被授與其他 Azure 資源的存取權。
  • 當您透過叢集建立裝入點時,叢集使用者可以立即存取裝入點。 若要在另一個執行中叢集使用掛接點,您必須在執行中叢集上執行 dbutils.fs.refreshMounts(),讓新建立的掛接點可供使用。
  • 在作業執行時卸載入點可能會導致錯誤。 請確定生產作業不會在處理時卸除記憶體。
  • 使用秘密的掛接點不會自動重新整理。 如果掛接的記憶體依賴輪替、過期或刪除的秘密,可能會發生錯誤,例如 401 Unauthorized。 若要解決這類錯誤,您必須卸除並重新掛接記憶體。
  • 階層命名空間 (HNS) 必須啟用,才能使用 ABFS 端點成功掛接 Azure Data Lake 儲存體 Gen2 記憶體帳戶。

在您的筆記本中執行下列命令,以驗證並建立裝入點。

configs = {"fs.azure.account.auth.type": "OAuth",
          "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
          "fs.azure.account.oauth2.client.id": "<application-id>",
          "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
          "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)
val configs = Map(
  "fs.azure.account.auth.type" -> "OAuth",
  "fs.azure.account.oauth.provider.type" -> "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
  "fs.azure.account.oauth2.client.id" -> "<application-id>",
  "fs.azure.account.oauth2.client.secret" -> dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
  "fs.azure.account.oauth2.client.endpoint" -> "https://login.microsoftonline.com/<directory-id>/oauth2/token")
// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

Replace

  • <application-id>具有 Azure Active Directory 應用程式的應用程式 (用戶端) 識別碼
  • <scope-name> 具有 Databricks 秘密範圍名稱。
  • <service-credential-key-name> 包含客戶端密碼的金鑰名稱。
  • <directory-id>具有 Azure Active Directory 應用程式的目錄(租用戶)標識碼
  • <container-name> 具有ADLS Gen2記憶體帳戶中容器的名稱。
  • <storage-account-name> 具有ADLS Gen2記憶體帳戶名稱。
  • <mount-name> 具有 DBFS 中預期裝入點的名稱。