Azure Databricks挂载成功后执行dbutils.fs.ls报错的解决咨询
解决Azure Databricks挂载点执行
dbutils.fs.ls报错问题 问题重现
执行以下代码列出挂载点内容时:
dbutils.fs.ls('/mnt/dz/')
触发错误:
shaded.databricks.org.apache.hadoop.fs.azure.AzureException: java.util.NoSuchElementException: An error occurred while enumerating the result, check the original exception for details.
此前已通过SAS令牌完成挂载点创建,代码如下:
mountPoint = "/mnt/dz/" if not any(mount.mountPoint == mountPoint for mount in dbutils.fs.mounts()): try: dbutils.fs.mount( source = "wasbs://{}@{}.blob.core.windows.net".format(blobContainerName, storageAccountName), mount_point = mountPoint, #extra_configs = {'fs.azure.account.key.' + storageAccountName + '.blob.core.windows.net': storageAccountAccessKey} extra_configs = {'fs.azure.sas.' + blobContainerName + '.' + storageAccountName + '.blob.core.windows.net': sasToken} ) print("mount succeeded!") except Exception as e: print("mount exception", e)
排查与解决步骤
验证SAS令牌的权限与有效性
- 确认SAS令牌包含
List权限(权限参数需包含l,这是执行ls操作的必要条件)。 - 检查SAS令牌的过期时间(
se字段),确保未超过当前时间。 - 直接通过SAS令牌访问Blob容器的REST接口,验证是否能正常列出容器内内容。
- 确认SAS令牌包含
核对挂载配置的SAS格式
- 确保
extra_configs中的键格式正确:fs.azure.sas.<容器名>.<存储账户名>.blob.core.windows.net,检查容器名、存储账户名拼写无误。 - 确认SAS令牌没有多余前缀(比如不要带
?符号,仅保留令牌字符串本身)。
- 确保
重新挂载并清理缓存
- 先卸载现有挂载点:
dbutils.fs.unmount("/mnt/dz/") - 刷新挂载点缓存:
dbutils.fs.refreshMounts() - 使用修正后的参数重新执行挂载代码,确保SAS令牌与配置完全正确。
- 先卸载现有挂载点:
检查Blob容器状态
- 登录Azure门户确认目标Blob容器是否有内容(空容器在部分Databricks版本中执行
ls会触发类似错误)。 - 排查容器内Blob是否存在单独的ACL设置,避免与容器SAS权限冲突。
- 登录Azure门户确认目标Blob容器是否有内容(空容器在部分Databricks版本中执行
查看详细错误日志
- 进入Databricks集群页面的“日志”选项卡,查看
driver/logs下的日志文件,搜索AzureException或NoSuchElementException相关条目,获取原始异常的详细信息,定位具体问题。
- 进入Databricks集群页面的“日志”选项卡,查看
内容的提问来源于stack exchange,提问作者Godwin Kuate
相关产品推荐
相关产品推荐

