Python 尝试访问Azure Databricks中的Azure DBFS文件系统时发生装载错误
我能够建立到我的Databricks文件存储Python 尝试访问Azure Databricks中的Azure DBFS文件系统时发生装载错误,python,azure,databricks,azure-databricks,Python,Azure,Databricks,Azure Databricks,我能够建立到我的Databricks文件存储DBFS的连接并访问文件存储 使用Pyspark读取、写入和转换数据是可能的,但当我尝试使用本地Python API(如pathlib或OS模块)时,我无法通过DBFS文件系统的第一级 我可以使用一个神奇的命令: %fs-ls-dbfs:\mnt\my\u-fs\…哪个功能完美,列出了所有子目录 但是如果我执行os.listdir('\dbfs\mnt\my\u fs\')操作,它将['mount.err']作为返回值返回 我已经在一个新集群上测试了这
DBFS
的连接并访问文件存储
使用Pyspark读取、写入和转换数据是可能的,但当我尝试使用本地Python API(如pathlib
或OS
模块)时,我无法通过DBFS文件系统的第一级
我可以使用一个神奇的命令:
%fs-ls-dbfs:\mnt\my\u-fs\…
哪个功能完美,列出了所有子目录
但是如果我执行os.listdir('\dbfs\mnt\my\u fs\')
操作,它将['mount.err']
作为返回值返回
我已经在一个新集群上测试了这个,结果是一样的
我在Databricks Runtine版本6.1和ApacheSpark 2.4.4上使用Python
有谁能提供建议吗
编辑:
连接脚本:
我使用了Databricks CLI库来存储根据Databricks文档格式化的凭据:
def initialise_connection(secrets_func):
configs = secrets_func()
# Check if the mount exists
bMountExists = False
for item in dbutils.fs.ls("/mnt/"):
if str(item.name) == r"WFM/":
bMountExists = True
# drop if exists to refresh credentials
if bMountExists:
dbutils.fs.unmount("/mnt/WFM")
bMountExists = False
# Mount a drive
if not (bMountExists):
dbutils.fs.mount(
source="adl://test.azuredatalakestore.net/WFM",
mount_point="/mnt/WFM",
extra_configs=configs
)
print("Drive mounted")
else:
print("Drive already mounted")
更新答案:使用Azure Data Lake Gen1存储帐户:dbutils可以访问adls Gen1令牌/access creds,因此mnt point中的文件列表可以工作,因为std py api调用无法访问creds/spark conf,所以您看到的第一个调用是列出文件夹,而它不会对adls api进行任何调用 我已经在Databricks运行时版本6.1中进行了测试(包括ApacheSpark2.4.4和Scala 2.11) 命令按例外情况工作,没有任何错误消息 更新:内部文件夹的输出
希望这有帮助。请尝试并让我们知道。我们在连接到Azure Generation2存储帐户(没有分级名称空间)时遇到了相同的问题
在将Databricks运行时环境从5.5切换到6.x时,似乎会发生此错误。然而,我们还无法确定这一现象的确切原因。我们假设某些功能可能已被弃用。当同一个容器装载到工作区中的两个不同路径时,我们遇到了这个问题。全部卸载和重新装载解决了我们的问题。我们使用的是Databricks版本6.2(Spark 2.4.4,Scala 2.11)。我们的blob存储容器配置:
- 性能/访问层:标准/热
- 复制:读取访问地理冗余存储(RA-GRS)
- 账户类型:StorageV2(通用v2)
/mnt
中的所有装载:
#迭代所有装载和卸载
打印('卸载以/mnt/'开头的所有装载)
dbutils.fs.mounts()
对于dbutils.fs.mounts()中的装载:
如果mount.mountPoint.startswith('/mnt/'):
dbutils.fs.unmount(mount.mountPoint)
#重新列出所有装载点
打印('重新列出所有装载')
dbutils.fs.mounts()
在自动化作业群集上测试的最小作业
假设您有一个单独的进程来创建挂载。创建作业定义(job.json
)以在自动化集群上运行Python脚本:
{
"name": "Minimal Job",
"new_cluster": {
"spark_version": "6.2.x-scala2.11",
"spark_conf": {},
"node_type_id": "Standard_F8s",
"driver_node_type_id": "Standard_F8s",
"num_workers": 2,
"enable_elastic_disk": true,
"spark_env_vars": {
"PYSPARK_PYTHON": "/databricks/python3/bin/python3"
}
},
"timeout_seconds": 14400,
"max_retries": 0,
"spark_python_task": {
"python_file": "dbfs:/minimal/job.py"
}
}
用于打印挂载的Python文件(job.py
):
导入操作系统
路径_mounts='/dbfs/mnt/'
打印(f“列出{path_mounts}的内容:”)
打印(os.listdir(路径安装))
path\u mount=路径\u mounts+“YOURCONTAINERNAME”
打印(f“列出{path_mount}的内容:”)
打印(os.listdir(路径安装))
运行databricks CLI命令以运行作业。查看火花驱动程序日志的输出,确认不存在mount.err
databricks fs mkdirs dbfs:/minimal
databricks fs cp job.py dbfs:/minimal/job.py--覆盖
databricks作业创建——json文件job.json
databricks作业现在运行--作业id
请在问题中添加包含完整错误消息的屏幕截图,好吗?还请共享mountpoint源位置?和DBFSAPI命令哪个有效?感谢您的更新,我将很快对此进行研究。我能够检索文件夹中的文件。这个问题看起来很奇怪。我将在ADLS Gen1存储装载上尝试同样的方法,并检查问题是否仍然存在;tx,谢谢,对我们来说,这是因为Databricks API从5.5版更改为6.0版,也就是说我使用了dbutils
解决了这个问题,但这并不有趣。我在Gen 2上没有这个问题。