通过databricks-connect在Pycharm调用spark_udf报MLflow FileNotFound错误
结论先行
你的两个判断完全正确:
mlflow.pyfunc.spark_udf默认不会将模型从驱动节点广播到工作节点,只会向每个执行器传递模型URI,由执行器主动向MLflow追踪服务拉取模型。你本地Windows环境的MLflow注册表无法被Databricks集群的Linux节点访问,路径格式不兼容直接导致了混合路径的文件找不到错误。- 你本地配置的
insecure = True和环境变量仅在本地客户端、Databricks驱动节点生效,执行器运行UDF时为独立Python进程,无法读取上述配置,因此SSL校验失败的问题会持续出现。
无需配置远程注册表/DBFS安全策略的解决方案
方案1:手动打包模型进UDF(开发阶段优先使用)
直接在本地加载模型,封装进自定义Pandas UDF中,模型会跟随UDF序列化后广播到所有执行器,无需执行器再主动拉取模型,适配绝大多数轻量scikit-learn模型场景:
import mlflow.pyfunc import pandas as pd from pyspark.sql.functions import pandas_udf, F # 本地直接从注册表加载模型 model = mlflow.pyfunc.load_model("models:/mymodel/production") # 封装预测逻辑为Pandas UDF @pandas_udf("double") def predict_udf(inputs: pd.DataFrame) -> pd.Series: return pd.Series(model.predict(inputs)) # 直接调用UDF即可 struct_col = F.struct(*df.columns) predictions = df.withColumn("pred_spark", predict_udf(struct_col)) predictions.show()
方案2:传递MLflow配置到执行器(适配远程注册表调用场景)
如果需要使用官方spark_udf接口从远程注册表拉取模型,在初始化Spark会话时主动将MLflow相关配置注入执行器环境变量即可解决SSL校验问题:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.executorEnv.MLFLOW_TRACKING_URI", "你的远程MLflow注册表地址") \ .config("spark.executorEnv.MLFLOW_TRACKING_INSECURE_TLS", "true") \ .getOrCreate() # 后续调用spark_udf即可正常运行 model_udf = mlflow.pyfunc.spark_udf(spark, "models:/mymodel/production")
方案3:上传模型包到集群临时目录加载
如果模型体积超过Spark广播变量2GB上限,可以将本地导出的模型包上传到所有执行器的临时目录,直接从本地路径创建UDF:
import mlflow.pyfunc import os # 本地导出模型为压缩包 local_model_path = "./temp_model" mlflow.pyfunc.save_model(local_model_path, python_model=model) # 上传模型文件到所有执行器的工作目录 spark.sparkContext.addFile(local_model_path, recursive=True) # 从执行器本地路径创建UDF model_udf = mlflow.pyfunc.spark_udf(spark, f"file:{os.path.basename(local_model_path)}")
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

