使用databricks连接从pycharm调用spark_udf时发现MLflow FileNotFound



我正在将一个scikit学习训练的模型保存到我的Windows笔记本电脑中的MLflow的模型注册表中。我使用databricks连接到Azure databricks集群,并从本地Pycharm在那里训练模型,但为了开发,我在laptopt中启动模型注册表,并将训练好的模型保存在其中,以避免必须设置远程访问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:

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

'/local_disk0/spark-1fa39b20-9d2c-4697-957c-392d80326dee/executor-57b039d8-7405-47c4-b07-612e9b87b3dd/spark-e442241d-4007-4c6e-8acd-bf2a35b1a455/inisolatedSparkFiles/044cd765-f5f7-46b3-9efb-0944cc91ef4d/c:\temp\tmpsl4hpeyt.zip'

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

编辑:在将模型注册到远程注册表后(没那么难!(我现在可以将注册的模型下载为sklearn模型并使用它进行预测,但我无法通过spark_udf进行同样的操作。我得到任一

  • 如果我通过运行指定模型,则会出现相同的FileNotFound错误:/。。。。函数中的spark_udf
  • 如果我通过模型指定模型,则会出现SSL错误(未验证的自签名证书(:/。。。在spark_udf中,尽管我在.databricksfg中明确添加了一个新行insecure = True,但由于这不起作用,我也添加了os.environ["MLFLOW_TRACKING_INSECURE_TLS"] = "true",但没有效果。我想它是在做一些事情,因为至少当它不是spark_udf,但看起来像";工人们"当他们试图做同样的事情时会遇到问题(这是我的猜测,不知道这是否有意义(

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

最新更新