共用方式為


透過 Azure Databricks 存取 Azure Data Lake Storage Gen1

Microsoft已宣佈淘汰 Azure Data Lake Storage Gen1 (先前稱為 Azure Data Lake Store,亦稱 ADLS),並建議所有使用者移轉至 Azure Data Lake Storage Gen2。 Databricks 建議您升級至 Azure Data Lake Storage Gen2,以獲得最佳效能和新功能。

存取 Azure Data Lake Storage Gen1 的方式共有兩種:

  1. 傳遞您的 Microsoft Entra ID 認證,也稱為認證傳遞
  2. 直接使用服務主體。

使用您的 Microsoft Entra ID 認證自動進行存取

您可以透過用於登入 Azure Databricks 的相同 Microsoft Entra ID,從 Azure Databricks 叢集自動向 Azure Data Lake Storage Gen1 進行驗證。 在叢集上啟用 Microsoft Entra ID 認證傳遞時,您在該叢集上執行的命令將能夠在 Azure Data Lake Storage Gen1 中讀取及寫入資料,而不需要設定服務主體認證來存取儲存體。

如需完整的安裝和使用指示,請參閱使用 Microsoft Entra ID 認證傳遞以存取 Azure Data Lake Storage (舊版)

建立和授與服務主體的權限

如果您選取的存取方法需要具有適當權限的服務主體,而您沒有權限,請遵循下列步驟:

  1. 請建立可存取資源的 Microsoft Entra ID (先前稱為 Azure Active Directory) 應用程式和服務主體。 請注意下列屬性:
    • application-id:可唯一識別用戶端應用程式的識別碼。
    • directory-id:可唯一識別 Microsoft Entra ID 執行個體的識別碼。
    • service-credential:應用程式用以證明其身分識別的字串。
  2. 在 Azure Data Lake Storage Gen1 帳戶上註冊服務主體後,系統會授與正確的角色指派 (例如參與者)。

使用服務主體和 OAuth 2.0,直接使用 Spark API 進行存取

若要從 Azure Data Lake Storage Gen1 帳戶進行讀取,您可以將 Spark 設定為使用服務認證搭配筆記本中的下列程式碼片段:

spark.conf.set("fs.adl.oauth2.access.token.provider.type", "ClientCredential")
spark.conf.set("fs.adl.oauth2.client.id", "<application-id>")
spark.conf.set("fs.adl.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"))
spark.conf.set("fs.adl.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

where

  • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 會擷取已儲存為秘密範圍秘密的儲存體帳戶存取金鑰。

設定認證之後,您可以使用標準 Spark 和 Databricks API 來存取資源。 例如:

val df = spark.read.format("parquet").load("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")

dbutils.fs.ls("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")

Azure Data Lake Storage Gen1 可提供目錄層級存取控制,因此服務主體必須能夠存取您想要讀取的目錄,以及 Azure Data Lake Storage Gen1 資源。

透過中繼存放區進行存取

若要存取中繼存放區中指定的 adl:// 位置,您必須在建立叢集時,將 Hadoop 認證組態選項指定為 Spark 選項,方法是將 spark.hadoop. 前置詞新增至對應的 Hadoop 組態金鑰,以將其傳播至中繼存放區所使用的 Hadoop 組態:

spark.hadoop.fs.adl.oauth2.access.token.provider.type ClientCredential
spark.hadoop.fs.adl.oauth2.client.id <application-id>
spark.hadoop.fs.adl.oauth2.credential <service-credential>
spark.hadoop.fs.adl.oauth2.refresh.url https://login.microsoftonline.com/<directory-id>/oauth2/token

警告

  • 這些認證可供所有存取叢集的使用者使用。

裝載 Azure Data Lake Storage Gen1 資源或資料夾

若要裝載 Azure Data Lake Storage Gen1 資源或其中的資料夾,請使用下列命令:

Python

configs = {"fs.adl.oauth2.access.token.provider.type": "ClientCredential",
          "fs.adl.oauth2.client.id": "<application-id>",
          "fs.adl.oauth2.credential": dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
          "fs.adl.oauth2.refresh.url": "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 = "adl://<storage-resource>.azuredatalakestore.net/<directory-name>",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

Scala

val configs = Map(
  "fs.adl.oauth2.access.token.provider.type" -> "ClientCredential",
  "fs.adl.oauth2.client.id" -> "<application-id>",
  "fs.adl.oauth2.credential" -> dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
  "fs.adl.oauth2.refresh.url" -> "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 = "adl://<storage-resource>.azuredatalakestore.net/<directory-name>",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

where

  • <mount-name> 是 DBFS 路徑,代表於 DBFS 中裝載 Azure Data Lake Storage Gen1 帳戶或其內部資料夾 (在 source 內指定) 的位置。
  • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 會擷取已儲存為秘密範圍秘密的儲存體帳戶存取金鑰。

請使用與存取本機檔案相同的方式存取容器中的檔案,例如:

Python

df = spark.read.format("text").load("/mnt/<mount-name>/....")
df = spark.read.format("text").load("dbfs:/mnt/<mount-name>/....")

Scala

val df = spark.read.format("text").load("/mnt/<mount-name>/....")
val df = spark.read.format("text").load("dbfs:/mnt/<mount-name>/....")

設定多個帳戶的服務認證

您可以藉由將 account.<account-name> 新增至組態金鑰,為多個 Azure Data Lake Storage Gen1 帳戶設定服務認證,以在單一 Spark 工作階段中使用。 例如,如果您想要設定帳戶的認證來存取 adl://example1.azuredatalakestore.netadl://example2.azuredatalakestore.net,您可以執行下列動作:

spark.conf.set("fs.adl.oauth2.access.token.provider.type", "ClientCredential")

spark.conf.set("fs.adl.account.example1.oauth2.client.id", "<application-id-example1>")
spark.conf.set("fs.adl.account.example1.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential-example1>"))
spark.conf.set("fs.adl.account.example1.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id-example1>/oauth2/token")

spark.conf.set("fs.adl.account.example2.oauth2.client.id", "<application-id-example2>")
spark.conf.set("fs.adl.account.example2.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential-example2>"))
spark.conf.set("fs.adl.account.example2.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id-example2>/oauth2/token")

這也適用於叢集 Spark 組態

spark.hadoop.fs.adl.oauth2.access.token.provider.type ClientCredential

spark.hadoop.fs.adl.account.example1.oauth2.client.id <application-id-example1>
spark.hadoop.fs.adl.account.example1.oauth2.credential <service-credential-example1>
spark.hadoop.fs.adl.account.example1.oauth2.refresh.url https://login.microsoftonline.com/<directory-id-example1>/oauth2/token

spark.hadoop.fs.adl.account.example2.oauth2.client.id <application-id-example2>
spark.hadoop.fs.adl.account.example2.oauth2.credential <service-credential-example2>
spark.hadoop.fs.adl.account.example2.oauth2.refresh.url https://login.microsoftonline.com/<directory-id-example2>/oauth2/token

下列筆記本會示範如何直接存取 Azure Data Lake Storage Gen1,以及透過裝載進行存取。

ADLS Gen1 服務主體筆記本

取得筆記本