共用方式為


使用 Microsoft Entra ID (先前稱為 Azure Active Directory) 認證傳遞來存取 Azure Data Lake Storage (舊版)

重要

此檔已淘汰,且可能未更新。

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

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

注意

本文包含將字詞 列入允許列表的參考,這是 Azure Databricks 未使用的字詞。 從軟體中移除該字詞時,我們也會將其從本文中移除。

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

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

此文章涵蓋:

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

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

需求

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

重要

如果您位於尚未設定為允許流量Microsoft Entra ID 的防火牆後方,就無法使用Microsoft Entra 標識符認證向 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 認證傳遞

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

重要

啟用高並行叢集的 Azure Data Lake Storage 認證傳遞會封鎖叢集 上除埠 44、53 和 80 以外的 所有埠。

  1. 當您建立叢集時,請將 [叢集模式] 設定[高并行]。
  2. 在 [進階選項] 底下,選取 [啟用用戶層級數據存取的認證傳遞],只允許 Python 和 SQL 命令

啟用高併行叢集的認證傳遞

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

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

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

重要

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

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

啟用標準叢集的認證傳遞

建立容器

容器 提供在 Azure 記憶體帳戶中組織物件的方式。

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

設定 Azure Data Lake Storage 認證傳遞和建立記憶體容器之後,您可以使用路徑直接存取 Azure Data Lake Storage Gen1 adl:// 中的數據,並使用 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 認證。 其他使用者可以看到此裝入點,但唯一具有讀取和寫入存取權的使用者是那些:

  • 具有基礎 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 中預定裝入點的名稱。

警告

請勿提供記憶體帳戶存取金鑰或服務主體認證,以向裝入點進行驗證。 這可讓其他使用者使用這些認證存取文件系統。 Azure Data Lake Storage 認證傳遞的目的是要防止您使用這些認證,並確保文件系統的存取僅限於可存取基礎 Azure Data Lake Storage 帳戶的使用者。

安全性

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

支援的功能

功能 最低 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 中的位置時,才會通過認證。 針對解析為其他記憶體系統的 DBFS 路徑,請使用不同的方法來指定您的認證。
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 大小有限制,因為大型 UDF 會以廣播變數的形式傳送。
筆記本範圍的連結庫 5.5
Scala 5.5
SparkR 6.0
sparklyr 10.1
從另一個筆記本執行 Databricks 筆記本 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 目錄
  • 資料表存取控制。 Azure Data Lake Storage 認證傳遞所授與的許可權可用來略過數據表 ACL 的細部許可權,而數據表 ACL 的額外限制會限制您從認證傳遞中獲得的一些優點。 特別:
    • 如果您有Microsoft Entra ID 許可權可存取特定數據表底下的數據檔,則不論透過數據表 ACL 放置的限制為何,您都會透過 RDD API 在該數據表上擁有完整許可權。
    • 只有在使用 DataFrame API 時,才會受到數據表 ACL 許可權的限制。 如果您嘗試使用 DataFrame API 直接讀取檔案,即使您可以透過 RDD API 直接讀取這些檔案,您也會看到任何檔案沒有許可權 SELECT 的警告。
    • 即使您有數據表 ACL 讀取資料表的許可權,您也無法從 Azure Data Lake Storage 以外的檔案系統所支援的數據表讀取。
  • SparkContext (sc) 和 SparkSession (spark) 物件的下列方法:
    • 已被取代的方法。
    • addFile()addJar() 之類的方法可讓非系統管理員使用者呼叫 Scala 程式代碼。
    • 存取 Azure Data Lake Storage Gen1 或 Gen2 以外的檔案系統的任何方法(若要存取已啟用 Azure Data Lake Storage 認證傳遞的叢集上其他文件系統,請使用不同的方法來指定您的認證,並參閱 [疑難解答] 底下的受信任文件系統一節。
    • 舊的Hadoop API (hadoopFile()hadoopRDD())。
    • 串流 API,因為傳遞的認證會在數據流仍在執行時過期。
  • 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和更新版本時,您無法在已啟用認證傳遞的叢集上新增分割區。 如需詳細資訊,請參閱相關的 疑難解答一節

範例筆記本

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

Azure Data Lake Storage Gen1 傳遞筆記本

取得筆記本

Azure Data Lake Storage Gen2 傳遞筆記本

取得筆記本

疑難排解

py4j.security.Py4JSecurityException: ... 未列入允許清單

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

org.apache.spark.api.python.PythonSecurityException:路徑 ... 使用不受信任的文件系統

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

若要在 Azure Data Lake Storage 認證通道叢集上設定一組受信任的檔案系統,請將該叢集上的 Spark conf 索引鍵 spark.databricks.pyspark.trustedFilesystems 設定為 org.apache.hadoop.fs.FileSystem 受信任實作的類別名稱逗號分隔清單。

啟用認證傳遞時,新增分割區會失敗AzureCredentialNotFoundException

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

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

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