分享方式:


連線至 Azure Data Lake Storage Gen2 和 Blob 儲存體

注意

本文說明設定 Azure Data Lake Storage Gen2 存取權的舊版模式。 Databricks 建議使用 Unity 目錄來設定 Azure Data Lake Storage Gen2 和磁碟區的存取權,以便直接與檔案互動。 請參閱使用 Unity 目錄連線到雲端物件儲存體

本文說明如何從 Azure Databricks 連線到 Azure Data Lake Storage Gen2 和 Blob 儲存體。

注意

使用 Azure 認證連線到 Azure Data Lake Storage Gen2 或 Blob 儲存體

下列認證可用來存取 Azure Data Lake Storage Gen2 或 Blob 儲存體:

  • 具有 Microsoft Entra ID 服務主體的 OAuth 2.0:Databricks 建議使用 Microsoft Entra ID 服務主體來連線到 Azure 儲存體。 若要建立 Microsoft Entra ID 服務主體並提供其 Azure 儲存體帳戶的存取權,請參閱使用服務主體和 Microsoft Entra ID (Azure Active Directory) 存取儲存體

    若要建立 Microsoft Entra ID 服務主體,您必須具有 Application Administrator 角色 或 Microsoft Entra ID 中的 Application.ReadWrite.All 權限。 若要在儲存體帳戶上指派角色,您必須是儲存體帳戶上具有使用者存取管理員 Azure RBAC 角色的擁有者或使用者。

  • 共用存取簽章 (SAS):您可以使用儲存體 SAS 權杖 來存取 Azure 儲存體。 透過 SAS,您可以使用暫存權杖搭配更細緻的存取控制來限制對儲存體帳戶的存取。

    您只能自行授與儲存體帳戶、容器或檔案上所擁有的 SAS 權杖權限。

  • 帳戶金鑰:您可以使用儲存體帳戶存取金鑰來管理 Azure 儲存體的存取權。 儲存體帳戶存取金鑰提供儲存體帳戶設定以及資料的完整存取權。 Databricks 建議使用 Microsoft Entra ID 服務主體或 SAS 權杖來連線到 Azure 儲存體,而不是使用帳戶金鑰。

    若要檢視帳戶的存取金鑰,您必須在儲存體帳戶上擁有擁有者、參與者或儲存體帳戶金鑰操作員服務角色。

Databricks 建議使用秘密範圍來儲存所有認證。 您可以授與工作區存取權中的使用者、服務主體和群組,以讀取秘密範圍。 這可保護 Azure 認證,同時允許使用者存取 Azure 儲存體。 若要建立祕密範圍,請參閱祕密範圍

設定 Spark 屬性來設定 Azure 認證,以存取 Azure 儲存體

您可以設定 Spark 屬性來設定 Azure 認證,以存取 Azure 儲存體。 認證的範圍可以設定為叢集或筆記本。 同時使用叢集存取控制和筆記本存取控制來保護對 Azure 儲存體的存取。 請參閱計算權限使用 Databricks 筆記本的共同作業

注意

Microsoft Entra ID 服務主體也可用來從 SQL 倉儲存取 Azure 儲存體,請參閱啟用資料存取設定

若要設定 Spark 屬性,請在叢集的 Spark 組態或筆記本中使用下列片段:

Azure 服務主體

使用下列格式來設定叢集 Spark 組態:

spark.hadoop.fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net OAuth
spark.hadoop.fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
spark.hadoop.fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net <application-id>
spark.hadoop.fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net {{secrets/<secret-scope>/<service-credential-key>}}
spark.hadoop.fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net https://login.microsoftonline.com/<directory-id>/oauth2/token

您可以在筆記本中使用 spark.conf.set,如以下範例所示:

service_credential = dbutils.secrets.get(scope="<secret-scope>",key="<service-credential-key>")

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net", service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

Replace

  • 具有 Databricks 祕密範圍名稱的 <secret-scope>
  • 具有包含用戶端祕密之金鑰名稱的 <service-credential-key>
  • 具有 Azure 儲存體帳戶名稱的 <storage-account>
  • 具有 Microsoft Entra ID 應用程式之應用程式 (用戶端) ID<application-id>
  • 具有 Microsoft Entra ID 應用程式之目錄 (租用戶) ID<directory-id>

SAS 權杖

您可以在相同的 Spark 工作階段中設定多個儲存體帳戶的 SAS 權杖。

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "SAS")
spark.conf.set("fs.azure.sas.token.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
spark.conf.set("fs.azure.sas.fixed.token.<storage-account>.dfs.core.windows.net", dbutils.secrets.get(scope="<scope>", key="<sas-token-key>"))

Replace

  • 具有 Azure 儲存體帳戶名稱的 <storage-account>
  • 具有 Azure Databricks 祕密範圍名稱的 <scope>
  • 具有包含 Azure 儲存體 SAS 權杖之金鑰名稱的 <sas-token-key>

帳戶金鑰

spark.conf.set(
    "fs.azure.account.key.<storage-account>.dfs.core.windows.net",
    dbutils.secrets.get(scope="<scope>", key="<storage-account-access-key>"))

Replace

  • 具有 Azure 儲存體帳戶名稱的 <storage-account>
  • 具有 Azure Databricks 祕密範圍名稱的 <scope>
  • 具有包含 Azure 儲存體帳戶存取金鑰之金鑰名稱的 <storage-account-access-key>

存取 Azure 儲存體

正確設定認證以存取 Azure 儲存體容器之後,您就可以使用 URI 與儲存體帳戶中的資源互動。 Databricks 建議使用 abfss 驅動程式來獲得更高的安全性。

spark.read.load("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")

dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")
CREATE TABLE <database-name>.<table-name>;

COPY INTO <database-name>.<table-name>
FROM 'abfss://container@storageAccount.dfs.core.windows.net/path/to/folder'
FILEFORMAT = CSV
COPY_OPTIONS ('mergeSchema' = 'true');

範例筆記本

具有 Microsoft Entra ID (先前稱為 Azure Active Directory) 的 ADLS Gen2 OAuth 2.0 服務主體筆記本

取得筆記本

Azure Data Lake Storage Gen 2 已知問題

如果您嘗試存取透過 Azure 入口網站建立的儲存體容器,您可能會收到下列錯誤:

StatusCode=404
StatusDescription=The specified filesystem does not exist.
ErrorCode=FilesystemNotFound
ErrorMessage=The specified filesystem does not exist.

啟用階層式命名空間時,您不需要透過 Azure 入口網站建立容器。 如果您看到此問題,請透過 Azure 入口網站刪除 Blob 容器。 幾分鐘後,您就可以存取容器。 或者,您可以變更 abfss URI 以使用不同的容器,前提是此容器不是透過 Azure 入口網站建立。

請參閱 Microsoft 文件中的 Azure Data Lake Storage Gen2 已知問題

從 Azure Databricks 儲存和存取資料的模式已遭淘汰

以下是已被取代的儲存體模式: