You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:36:08