分享方式:


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

重要

掛接是舊版存取模式。 Databricks 建議使用 Unity 目錄來管理所有數據存取。 請參閱使用 Unity 目錄將 連線 至雲端物件記憶體。

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 中預期裝入點的名稱。