如何重新挂载所有Databricks集群的Azure ADLS挂载点?集群同步疑问
问题
由于账户服务主体密钥过期,需在所有集群上使用新密钥重新挂载Azure ADLS挂载点。现有3个集群:clusterA、clusterB、clusterC;3个容器挂载点:/mnt/001disk、/mnt/002disk、/mnt/003disk,所有集群均挂载这些容器。
计划使用以下脚本执行重新挂载:
storage_account_name = "aaaaaaaaaa" tenant = 'xxxxxxxxxxxxxxx' service_principal_id = "yyyyyy" service_principal_secret = "zzzzzzzzzzzzzzzzzzz" def func_mount_adls(source:str, mount_point:str): print(source) print(mount_point) # declare necessary information for ADLS connection configs = { 'fs.azure.account.auth.type': 'OAuth', 'fs.azure.account.oauth.provider.type': 'org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider', 'fs.azure.account.oauth2.client.id': service_principal_id, 'fs.azure.account.oauth2.client.secret': service_principal_secret, 'fs.azure.account.oauth2.client.endpoint': f'https://login.microsoftonline.com/{tenant}/oauth2/token' } mount_points = list(map(lambda mount: mount.mountPoint, dbutils.fs.mounts())) # mount storage if not mounted yet if not (mount_point in mount_points): dbutils.fs.mount( source = source, mount_point = mount_point, extra_configs = configs ) # Databricks notebook source import os import re import time from datetime import datetime, timedelta storage_account_name = os.environ['storage_account_name'] # COMMAND --------- listToReMnt = [ "001disk", "002disk", "003disk" ] def unmount_container(container_name): print(f"unmount /mnt/{container_name}") dbutils.fs.unmount(f"/mnt/{container_name}") def mount_contianer(container_name): return_value = {} container_name = container_name source = f'abfss://{container_name}@{storage_account_name}.dfs.core.windows.net/' mount_point = f'/mnt/{container_name}' mount_points = list(map(lambda mount: mount.mountPoint, dbutils.fs.mounts())) print(f"mount /mnt/{container_name}") print(mount_points) # mount storage if not mounted yet if not (mount_point in mount_points): try: func_mount_adls(source=source, mount_point=mount_point) except Exception as e: print(e) for x in listToReMnt: print("==============================================================") unmount_container(x) mount_contianer(x) print('dbutils.fs.ls(f"/mnt/{x}")') print(dbutils.fs.ls(f"/mnt/{x}"))
现咨询以下问题:
- 是否需在每个集群运行该重新挂载脚本?还是在一个集群运行后,其他集群会自动更新?
- 若是后者,如何保障集群安全性(如系统访问或AD访问)?
- 根据Databricks文档说明:
When you create a mount point through a cluster, cluster users can immediately access the mount point. To use the mount point in another running cluster, you must run dbutils.fs.refreshMounts() on that running cluster to make the newly created mount point available for use.
此说明是否意味着在一个集群(如clusterA)更新后,其他集群(如clusterB、clusterC)会自动更新?若否,是否必须在每个集群手动重新挂载?(该方式效率较低)
注:因需求与限制,不考虑使用Terraform等类似工具。
回答
核心结论
必须在每个集群上执行重新挂载脚本,无法通过单个集群操作自动同步到其他集群。
原因说明
- 挂载点的认证配置(如服务主体密钥)存储在集群本地上下文,而非全局共享。旧挂载使用过期密钥,即使在clusterA上重新挂载更新了密钥,clusterB、clusterC的现有挂载依然沿用旧密钥,无法正常访问ADLS。
- 你引用的Databricks文档描述的是新建挂载点的场景:在集群A创建新挂载后,运行中的集群B需要执行
dbutils.fs.refreshMounts()才能识别到这个新挂载。但对于更新已有挂载的认证信息的场景,refreshMounts()无法刷新已挂载点的密钥配置,必须重新卸载并挂载。
效率优化方案(不使用Terraform)
如果不想手动逐个集群运行脚本,可以采用以下两种方式:
- 集群初始化脚本:将重新挂载脚本打包成初始化脚本,配置到所有集群的"初始化脚本"设置中。集群重启时会自动执行脚本完成重新挂载,无需手动操作。
- 批量作业提交:将脚本保存为Databricks Notebook,通过Databricks Jobs功能批量提交到所有集群运行,一次性完成所有集群的挂载更新。
安全性保障措施
- 密钥安全存储:不要将服务主体密钥硬编码在脚本中,改用Databricks Secrets存储密钥,脚本中通过
dbutils.secrets.get(scope="你的密钥范围", key="密钥名称")获取,避免密钥泄露。 - 权限管控:限制能执行挂载操作的用户权限,仅允许集群管理员或授权运维用户运行挂载脚本,防止未授权修改挂载配置。
- 挂载验证:保留脚本中的
dbutils.fs.ls()验证步骤,确保挂载后能正常访问ADLS,及时发现配置问题。
内容的提问来源于stack exchange,提问作者Question-er XDD
相关产品推荐
相关产品推荐

