共用方式為


使用 Microsoft Entra ID 認證傳遞(舊版)存取 Azure Data Lake Storage

重要

此文件已淘汰,可能無法更新。

從 Databricks Runtime 15.0 開始,認證傳遞已被取代,未來將會移除 Databricks Runtime 版本。 Databricks 建議您升級至 Unity Catalog。 Unity Catalog 藉由提供集中位置來管理和稽核帳戶中多個工作區的數據存取,藉此簡化數據的安全性和控管。 請參閱 Unity 是什麼 Catalog?

若要提升安全性與治理狀態,請連絡 Azure Databricks 帳戶團隊,以停用 Azure Databricks 帳戶的認證傳遞。

注意

本文包含對白名單術語的引用,Azure Databricks 不使用此術語。 當從軟體中移除該字詞時,我們也會在本文中 remove 移除它。

您可以使用用於登入 Azure Databricks 的相同 Microsoft Entra ID 身分識別,自動對從 Azure Databricks 存取 Azure Data Lake Storage Gen1 (ADLS Gen1) 和從 Azure Databricks 叢集存取 ADLS Gen2 進行身分驗證。 當您為叢集啟用 Azure Data Lake Storage 認證傳遞時,在該叢集上執行的命令可以在 Azure Data Lake Storage 中讀取和寫入數據,而不需要您設定服務主體 credentials 存取記憶體。

Azure Data Lake Storage Gen1 和 Gen2 僅支援 Azure Data Lake Storage 認證通道。 Azure Blob 儲存體不支援認證通道。

此文章涵蓋:

  • 啟用標準及高並行叢集的認證傳遞。
  • 在 ADLS 帳戶設定認證傳遞並初始化儲存體資源。
  • 啟用認證傳遞時,可直接存取 ADLS 資源。
  • 啟用認證傳遞時,透過掛接點存取 ADLS 資源。
  • 使用認證傳遞時支援的功能與限制。

包含筆記本來提供搭配 ADLS Gen1 及 ADLS Gen2 儲存體帳戶使用認證傳遞的範例。

需求

  • 進階方案。 如需將標準方案升級至進階方案的詳細資訊,請參閱升級或降級 Azure Databricks 工作區
  • Azure Data Lake Store Gen1 或 Gen2 儲存體帳戶。 Azure Data Lake Storage Gen2 儲存體帳戶必須使用「階層式命名空間」來搭配 Azure Data Lake Storage 認證通道。 如需建立新 ADLS Gen2 帳戶以及如何啟用階層命名空間的指示,請參閱建立儲存體帳戶
  • 已正確設定使用者對 Azure Data Lake Storage 的權限。 使用者應該具有正確的角色,例如儲存體 Blob 資料參與者,才能讀取及寫入儲存在 Azure Data Lake Storage 的資料。 請參閱使用 Azure 入口網站來指派用於存取 Blob 和佇列資料的 Azure 角色
  • 了解工作區管理員在啟用傳遞的工作區的權限,並檢閱您現有的工作區管理員指派。 工作區管理員可以管理其工作區的作業,包括新增使用者及服務主體、建立叢集,以及將其他使用者委派為工作區管理員。 工作區管理工作,例如管理作業擁有權及檢視筆記本,可能會間接存取 Azure Data Lake Storage 註冊的資料。 工作區管理員是一個特權角色,您應該謹慎分配。
  • 您無法使用以ADLS credentials設定的叢集,例如,服務主體 credentials,並搭配認證傳遞。

重要

如果您位於尚未設定為允許流量Microsoft Entra ID 的防火牆後方,就無法使用Microsoft Entra ID credentials 向 Azure Data Lake Storage 進行驗證。 根據預設,Azure 防火牆會封鎖 Active Directory 存取。 若要允許存取,請設定 AzureActiveDirectory 服務標籤。 您可以在 Azure IP 範圍和服務標籤 JSON 檔案中的 AzureActiveDirectory 標籤底下,找到網路虛擬裝置的對等資訊。 如需詳細資訊,請參閱 Azure 防火牆服務標籤

記錄建議

您可以在 Azure 儲存體診斷記錄中記錄傳遞至 ADLS 儲存體的身分識別。 記錄身分識別允許 ADLS 要求與 Azure Databricks 叢集中的個別使用者關聯。 開啟儲存體帳戶的診斷記錄,即可開始接收這些記錄:

  • Azure Data Lake Storage Gen1:遵循啟用 Data Lake Storage Gen1 帳戶診斷記錄的指示。
  • Azure Data Lake Storage Gen2:使用 PowerShell 搭配 Set-AzStorageServiceLoggingProperty 命令進行設定。 指定為 2.0 版本,因為記錄項目格式 2.0 在請求中包含使用者主體名稱。

為高並行叢集啟用 Azure Data Lake Storage 認證傳遞

高並行叢集可以由多個使用者共用。 它們僅支援具有 Azure Data Lake Storage 認證傳遞的 Python 和 SQL。

重要

啟用高並行叢集的 Azure Data Lake Storage 認證傳遞會封鎖叢集上所有連接埠(不包括連接埠 44、53 和 80 )。

  1. 當您 建立叢集時,set叢集模式高並行
  2. [進階選項]下,select[啟用憑證通過,以便進行使用者層級數據存取],只允許 Python 和 SQL 命令

為高並行性叢集啟用認證傳遞

為標準叢集啟用 Azure Data Lake Storage 認證傳遞

具有認證傳遞的標準叢集僅限於單一使用者。 標準叢集支援 Python、SQL、Scala 和 R。在 Databricks Runtime 10.4 LTS 及更新版本,支援 sparklyr。

您必須在叢集建立時指派使用者,但具有 CAN MANAGE 權限的使用者可以隨時編輯叢集以取代原始使用者。

重要

指派給叢集的使用者必須至少有叢集的 CAN ATTACH TO 權限,才能在叢集執行命令。 工作區管理員及叢集建立者具有 CAN MANAGE 權限,但除非它們是指定的叢集使用者,否則無法在叢集執行命令。

  1. 當您 建立叢集時,set 將 叢集模式 設定為 Standard
  2. [進階選項]下,[啟用使用者層級數據存取認證傳遞],並從 [單一使用者 存取] 下拉式清單中 使用者 名稱。

啟用標準叢集的認證傳遞

建立容器

容器提供在 Azure 儲存體帳戶組織物件的方式。

使用認證傳遞直接存取 Azure Data Lake Storage

設定 Azure Data Lake Storage 認證傳遞並建立儲存體容器後,您可以使用 adl:// 路徑直接存取 Azure Data Lake Storage Gen1 的資料,並使用 abfss:// 路徑存取 Azure Data Lake Storage Gen2。

Azure Data Lake Storage Gen1

Python

spark.read.format("csv").load("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv").collect()

R

# SparkR
library(SparkR)
sparkR.session()
collect(read.df("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv", source = "csv"))

# sparklyr
library(sparklyr)
sc <- spark_connect(method = "databricks")
sc %>% spark_read_csv("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv") %>% sdf_collect()
  • <storage-account-name> 替換為 ADLS Gen1 儲存帳戶名稱。

Azure Data Lake Storage Gen2

Python

spark.read.format("csv").load("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv").collect()

R

# SparkR
library(SparkR)
sparkR.session()
collect(read.df("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv", source = "csv"))

# sparklyr
library(sparklyr)
sc <- spark_connect(method = "databricks")
sc %>% spark_read_csv("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv") %>% sdf_collect()
  • <container-name> 替換為 ADLS Gen2 儲存帳戶的容器名稱。
  • <storage-account-name> 替換為 ADLS Gen2 儲存帳戶名稱。

使用認證傳遞將 Azure Data Lake Storage 掛接至 DBFS

您可以將 Azure Data Lake Storage 帳戶或其中的資料夾掛接到什麼是 DBFS?。 掛接是 Data Lake Store 的指標,因此資料永遠不會在本機同步。

當您使用已啟用 Azure Data Lake Storage 認證傳遞的叢集來掛載資料時,任何對掛載點的讀取或寫入都會使用您的 Microsoft Entra ID credentials。 其他使用者可以看到此掛接點,但擁有讀寫權限的使用者僅限於:

  • 具有基礎 Azure Data Lake Storage 儲存體帳戶的存取權
  • 使用已啟用 Azure Data Lake Storage 認證傳遞的叢集

Azure Data Lake Storage Gen1

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

Python

configs = {
   "fs.adl.oauth2.access.token.provider.type": "CustomAccessTokenProvider",
   "fs.adl.oauth2.access.token.custom.provider": spark.conf.get("spark.databricks.passthrough.adls.tokenProviderClassName")
 }

 # Optionally, you can add <directory-name> to the source URI of your mount point.
 dbutils.fs.mount(
   source = "adl://<storage-account-name>.azuredatalakestore.net/<directory-name>",
   mount_point = "/mnt/<mount-name>",
   extra_configs = configs)

Scala

 val configs = Map(
   "fs.adl.oauth2.access.token.provider.type" -> "CustomAccessTokenProvider",
   "fs.adl.oauth2.access.token.custom.provider" -> spark.conf.get("spark.databricks.passthrough.adls.tokenProviderClassName")
 )

 // Optionally, you can add <directory-name> to the source URI of your mount point.
 dbutils.fs.mount(
   source = "adl://<storage-account-name>.azuredatalakestore.net/<directory-name>",
   mountPoint = "/mnt/<mount-name>",
   extraConfigs = configs)
  • <storage-account-name> 替換為 ADLS Gen2 儲存帳戶名稱。
  • <mount-name> 替換為 DBFS 中預定掛接點的名稱。

Azure Data Lake Storage Gen2

若要掛接 Azure Data Lake Storage Gen2 檔案系統或其中的資料夾,請使用下列命令:

Python

configs = {
  "fs.azure.account.auth.type": "CustomAccessToken",
  "fs.azure.account.custom.token.provider.class": spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
}

# 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)

Scala

val configs = Map(
  "fs.azure.account.auth.type" -> "CustomAccessToken",
  "fs.azure.account.custom.token.provider.class" -> spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
)

// 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)
  • <container-name> 替換為 ADLS Gen2 儲存帳戶的容器名稱。
  • <storage-account-name> 替換為 ADLS Gen2 儲存帳戶名稱。
  • <mount-name> 替換為 DBFS 中預定掛接點的名稱。

警告

請勿提供儲存帳戶存取金鑰或服務主體 credentials 來驗證掛載點。 這可讓其他使用者使用這些 credentials存取文件系統。 Azure Data Lake Storage 認證傳遞的目的是要防止您 having 使用這些 credentials,並確保文件系統的存取僅限於可存取基礎 Azure Data Lake Storage 帳戶的使用者。

安全性

您可以安全與其他使用者共用 Azure Data Lake Storage 認證傳遞叢集。 您將被彼此隔離,且無法讀取或使用對方的 credentials。

支援的功能

功能 最小 Databricks 執行階段版本 備註
Python 和 SQL 5.5
Azure Data Lake Storage Gen1 5.5
%run 5.5
DBFS 5.5 只有在 DBFS 路徑解析為 Azure Data Lake Storage Gen1 或 Gen2 中的位置時,才會傳遞 Credentials。 針對對應於其他儲存系統的 DBFS 路徑,請使用不同的方法來指定您的 credentials。
Azure Data Lake Storage Gen2 5.5
磁碟快取 5.5
PySpark ML API 5.5 不支援下列 ML 類別:

- org/apache/spark/ml/classification/RandomForestClassifier
- org/apache/spark/ml/clustering/BisectingKMeans
- org/apache/spark/ml/clustering/GaussianMixture
- org/spark/ml/clustering/KMeans
- org/spark/ml/clustering/LDA
- org/spark/ml/evaluation/ClusteringEvaluator
- org/spark/ml/feature/HashingTF
- org/spark/ml/feature/OneHotEncoder
- org/spark/ml/feature/StopWordsRemover
- org/spark/ml/feature/VectorIndexer
- org/spark/ml/feature/VectorSizeHint
- org/spark/ml/regression/IsotonicRegression
- org/spark/ml/regression/RandomForestRegressor
- org/spark/ml/util/DatasetUtils
廣播變數 5.5 在 PySpark 中,您可以建構的 Python UDF 大小有 limit,因為大型 UDF 會以廣播變數的形式傳送。
筆記本範圍的程式庫 5.5
Scala 5.5
SparkR 6.0
sparklyr 10.1
協調筆記本,並將筆記本中的程式代碼模組化 6.1
PySpark ML API 6.1 支援所有 PySpark ML 類別。
叢集計量 6.1
Databricks Connect 7.3 標準叢集支援傳遞。

限制

Azure Data Lake Storage 認證傳遞不支援下列功能:

  • %fs(請改用對等的 dbutils.fs 命令)。
  • Databricks 作業
  • Databricks REST API 參考
  • Unity Catalog
  • Table 存取控制。 Azure Data Lake Storage 認證傳遞所授與的許可權可用來略過 table ACL 的細微許可權,而 table ACL 的額外限制會限制您從認證傳遞 get 的一些優點。 具體而言:
    • 如果您具備 Microsoft Entra ID 的權限來存取特定 table 的資料檔案,則您透過 RDD API 會對該 table 擁有完整權限,不論 table ACL 所施加的限制。
    • 只有在使用 DataFrame API 時,您才會受到 table ACL 許可權的限制。 如果您嘗試使用 DataFrame API 直接讀取檔案,即使您可以直接透過 RDD API 讀取這些檔案,您也會看到任何檔案上未 having 許可權 SELECT 的警告。
    • 即使您具有讀取 tables之 table ACL 許可權,您也無法從由非 Azure Data Lake Storage 的其他檔案系統支援的 tables 進行讀取。
  • SparkContext(sc)和 SparkSession (spark) 物件的下列方法:
    • 已取代的方法。
    • addFile()addJar() 等方法允許非管理員使用者呼叫 Scala 程式碼。
    • 存取 Azure Data Lake Storage Gen1 或 Gen2 以外的文件系統的任何方法(若要存取已啟用 Azure Data Lake Storage 認證傳遞的叢集上其他文件系統,請使用不同的方法來指定您的 credentials,並參閱在 疑難解答下信任的文件系統一節。
    • 舊的 Hadoop API(hadoopFile()hadoopRDD())。
    • 串流 API,因為傳遞的 credentials 會在串流仍在運行時過期。
  • DBFS 掛接/dbfs)僅適用於 Databricks Runtime 7.3 LTS 和更新版本。 不支援透過此路徑設定認證傳遞的掛接點。
  • Azure Data Factory。
  • 高並行叢集上的 MLflow
  • 高並行叢集上的 azureml-sdk Python 套件。
  • 您無法使用 Microsoft Entra ID 權杖存留期原則來延長 Microsoft Entra ID 傳遞權杖的存留期。 因此,如果您傳送命令到叢集所需的時間超過一小時,如果在 1 小時後才存取 Azure Data Lake Storage 資源,就會失敗。
  • 使用Hive 2.3和更新版本時,您無法在已啟用認證傳遞的叢集上新增 partition。 如需詳細資訊,請參閱有關疑難排解小節。

範例筆記本

下列筆記本示範 Azure Data Lake Storage Gen1 和 Gen2 的 Azure Data Lake Storage 認證傳遞。

Azure Data Lake Storage Gen1 傳遞筆記本

Get 筆記本

Azure Data Lake Storage Gen2 傳遞筆記本

Get 筆記本

疑難排解

py4j.security.Py4JSecurityException: … 未列入白名單

當您存取 Azure Databricks 尚未明確針對 Azure Data Lake Storage 認證傳遞叢集標示為安全的方法時,就會擲回此例外狀況。 在大部分情況下,這表示方法可讓 Azure Data Lake Storage 認證傳遞叢集上的使用者存取其他使用者的 credentials。

org.apache.spark.api.python.PythonSecurityException: 路徑…… 使用不受信任的檔案系統

當您嘗試存取 Azure Data Lake Storage 認證通道叢集未知的檔案系統時,就會擲回此例外狀況。 使用不可信任的文件系統可能會允許 Azure Data Lake Storage 認證傳遞叢集中某使用者存取其他使用者的 credentials,因此我們不允許使用不具安全信心的文件系統。

若要在 Azure Data Lake Storage 認證傳遞叢集上設定受信任文件系統的 set,set 該叢集上的 Spark conf 機碼 spark.databricks.pyspark.trustedFilesystems,以逗號分隔 list 信任 org.apache.hadoop.fs.FileSystem實作的類別名稱。

啟用認證傳遞時,新增 partition 失敗,並出現 AzureCredentialNotFoundException

使用Hive 2.3-3.1時,如果您嘗試在已啟用認證傳遞的叢集上新增 partition,就會發生下列例外狀況:

org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:com.databricks.backend.daemon.data.client.adl.AzureCredentialNotFoundException: Could not find ADLS Gen2 Token

若要解決此問題,請在未啟用認證傳遞的叢集新增分割區。