使用 Microsoft Entra ID 認證傳遞(舊版)存取 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 Databricks 存取 Azure Data Lake Storage Gen1 (ADLS Gen1) 和從 Azure Databricks 叢集存取 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 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認證設定的叢集,例如服務主體認證,以及認證傳遞。
重要
如果您位於尚未設定為允許流量到 Microsoft Entra ID 的防火牆後方,就無法使用 Microsoft Entra ID 憑證向 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 )。
為標準叢集啟用 Azure Data Lake Storage 認證傳遞
具有認證傳遞的標準叢集僅限於單一使用者。 標準叢集支援 Python、SQL、Scala 和 R。在 Databricks Runtime 10.4 LTS 及更新版本,支援 sparklyr。
您必須在叢集建立時指派使用者,但具有 CAN MANAGE 權限的使用者可以隨時編輯叢集以取代原始使用者。
重要
指派給叢集的使用者必須至少有叢集的 CAN ATTACH TO 權限,才能在叢集執行命令。 工作區管理員及叢集建立者具有 CAN MANAGE 權限,但除非它們是指定的叢集使用者,否則無法在叢集執行命令。
建立容器
容器提供在 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 認證。 其他使用者可以看到此掛接點,但擁有讀寫權限的使用者僅限於:
- 具有基礎 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 | |
協調筆記本,並將筆記本中的程式代碼模組化 | 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
若要解決此問題,請在未啟用認證傳遞的叢集新增分割區。