首页 > 解决方案 > 使用 databricks-connect 从 pycharm 调用 spark_udf 时的 MLflow FileNotFound

问题描述

我正在将一个 scikit-learn 训练的模型保存到我的 Windows 笔记本电脑中的 MLflow 模型注册表中。我正在使用 databricks-connect 连接到 Azure Databricks 集群并从我的本地 Pycharm 在那里训练模型,但是为了开发,我在我的笔记本电脑中启动模型注册表并将训练好的模型保存在其中 - 以避免必须设置远程访问 DBFS .

我在使用 spark_udf 函数时遇到问题。我可以从笔记本电脑的模型注册表中读取模型,但不能将其用作 Databricks 集群中的 UDF

model_udf = mlflow.pyfunc.spark_udf(spark, "models:/mymodel/production")  # this works fine
struct_col = F.struct(*df.columns)
predictions = df.withColumn("pred_spark", model_udf(struct_col))  
predictions.show()                                        # throws an exception(see below)

pyspark.sql.utils.PythonException:从 UDF 引发异常:'FileNotFoundError:

[Errno 2] 没有这样的文件或目录:

'/local_disk0/spark-1fa39b20-9d2c-4697-957c-392d80326dee/exectutor-57b039d8-472405-472472-612e912e9b87b87b3ddddddddddd dd/spark-e44242414.4424.44c6 park y44c6e4.4b4c6 aky44.4c6pary7b4.4c6pary7-4c6 pary-4.4 car 0944cc91ef4d/c:\temp\tmpsl4hpeyt.zip'

最后一部分很奇怪,因为它混合了 linux 风格的路由和 Windows 路由(就像我的 Windows 笔记本电脑本地目录中的路由)。我以为驱动程序会从模型注册表中读取模型并将其广播给工作人员以调用 UDF,但看起来工作人员正试图直接从远程模型注册表中获取它,对吗?是否有不需要将模型保存在远程模型注册表中的解决方案 - 或者至少,配置安全性以访问 DBFS?

编辑:设置将模型注册到远程注册表后(没那么难!)我现在可以将注册模型下载为 sklearn 模型并使用它进行预测,但我不能通过 spark_udf 做同样的事情。我得到

标签: apache-sparkpysparkmlflowdatabricks-connect

解决方案


Databricks 的构造几乎可以在本机函数中的任何地方使用 dbfs。当您在驱动程序或执行程序上指定一些本地路径或本地路径时,它无论如何都会在 DBFS 上查找。这就是为什么 /local_disk0/ 是默认的 tempt dbfs 位置,它在其他地方添加了您指定的子目录。我想在 spark 驱动程序上使用文件夹并放弃了,因为它总是添加 /local_disk0/ 前缀。


推荐阅读