如何使用托管标识连接Azure Databricks与ADLS Gen2并实现文件管理?
使用托管标识在Azure Databricks中直接读写管理ADLS Gen2文件的方案
默认情况下,Unity Catalog绑定的托管标识仅用于元数据存储的管理,Notebook会话不会自动复用该标识访问ADLS Gen2文件。要实现通过托管标识在Notebook中直接操作ADLS文件,可按以下步骤配置:
1. 为托管标识配置ADLS Gen2权限
前往Azure门户,找到目标ADLS Gen2存储账户:
- 进入访问控制(IAM)页面,添加角色分配,给Unity Catalog的托管标识分配存储Blob数据参与者(或按需分配更细粒度的权限,如
读取Blob、写入Blob、删除Blob等)。 - 权限作用范围可设置为整个存储账户、特定容器或具体路径,根据实际需求选择。
2. 在Databricks中配置访问方式
方式一:使用Unity Catalog外部位置(推荐)
通过创建外部位置统一管理存储路径与权限,符合Unity Catalog的治理规范:
- 先基于托管标识创建Unity Catalog凭据(未创建时执行):
CREATE CREDENTIAL mi_credential WITH IDENTITY = 'Managed Identity', SECRET = '<managed-identity-client-id>'; - 创建指向ADLS Gen2路径的外部位置:
CREATE EXTERNAL LOCATION adls_managed_location URL 'abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<target-path>' WITH (CREDENTIAL mi_credential); - 给需要操作文件的用户/组分配外部位置权限:
-- 分配读写文件权限 GRANT READ FILES, WRITE FILES ON EXTERNAL LOCATION adls_managed_location TO `<user-or-group-name>`; -- 如需创建外部表,可额外分配CREATE权限 GRANT CREATE ON EXTERNAL LOCATION adls_managed_location TO `<user-or-group-name>`; - 在Notebook中直接使用该路径操作文件:
# 列出目录下文件 dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<target-path>") # 读取文件 df = spark.read.csv("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<target-path>/data.csv") # 写入文件 df.write.parquet("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<target-path>/output.parquet")
方式二:在Notebook会话中直接配置托管标识访问
如果不需要统一的权限治理,可直接在Notebook中配置Spark会话使用托管标识:
# 替换占位符为实际的存储账户ID、租户ID、托管标识客户端ID storage_account = "<storage-account-name>" tenant_id = "<azure-tenant-id>" mi_client_id = "<managed-identity-client-id>" # 配置Spark属性 spark.conf.set(f"fs.azure.account.auth.type.{storage_account}.dfs.core.windows.net", "OAuth") spark.conf.set(f"fs.azure.account.oauth.provider.type.{storage_account}.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") spark.conf.set(f"fs.azure.account.oauth2.client.id.{storage_account}.dfs.core.windows.net", mi_client_id) spark.conf.set(f"fs.azure.account.oauth2.client.endpoint.{storage_account}.dfs.core.windows.net", f"https://login.microsoftonline.com/{tenant_id}/oauth2/token") spark.conf.set(f"fs.azure.account.oauth2.client.secret.{storage_account}.dfs.core.windows.net", "")
配置完成后,即可使用dbutils.fs或Spark API直接操作ADLS Gen2文件。
3. 验证配置
执行简单的文件操作命令确认权限生效:
# 写入测试文件 dbutils.fs.put("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/test.txt", "test content", overwrite=True) # 列出文件 display(dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/"))
注意事项
- 托管标识的IAM权限分配后,可能需要5-10分钟才能生效。
- 优先使用外部位置方式,便于统一管理存储路径和权限,符合Unity Catalog的数据治理要求。
- 如需集群所有会话默认使用该托管标识,可将上述Spark配置添加到集群的Spark配置中,无需在每个Notebook重复配置。
内容的提问来源于stack exchange,提问作者Adhash
相关产品推荐
相关产品推荐

