使用databricks-connect将Spark模型日志到Databricks注册表报错
问题场景
通过Databricks Connect,使用MLflow将训练完成的Spark模型日志到Databricks模型注册表时,执行mlflow.spark.log_model代码行程序中断。
使用的代码:
mlflow.set_tracking_uri("databricks") mlflow.set_experiment("/Users/xxxxx/experiment_name") with mlflow.start_run(run_name="my_run") as _: mlflow.spark.log_model(my_spark_model, "my_model")
关键错误信息
22/07/21 11:05:03 WARN ProtoSerializer: 反序列化远程异常失败
java.io.InvalidClassException: 无法读取类描述符
...
Caused by: java.lang.ClassNotFoundException: com.databricks.backend.daemon.data.common.InvalidMountException
...
22/07/21 11:05:03 ERROR Instrumentation: com.databricks.service.SparkServiceRemoteException: com.databricks.backend.daemon.data.common.InvalidMountException: 在挂载点'/databricks/mlflow-tracking'内解析路径'/000000000000000/0a0a0a0a0a0a0a0a0a0a/artifacts\experiment_name/sparkml'时出错
...
Caused by: java.io.IOException: 不支持该路径的访问机制,请使用MLflow客户端
...
最终抛出:
py4j.protocol.Py4JJavaError: 调用o1532.copyToLocalFile时出错。
: java.io.IOException: 命令字符串中有(null)条目: null chmod 0644 C:\Users\itscarlayall\AppData\Local\Temp\tmpalmxdo16\model\sparkml\metadata_SUCCESS
问题原因
- Databricks Connect环境下,
mlflow.spark.log_model依赖本地Spark环境处理模型文件,无法直接适配Databricks的MLflow存储路径,导致文件系统访问机制不兼容。 - Windows环境下路径分隔符(
\)与Unix风格(/)混合,引发路径解析错误。 - Databricks Connect与集群Spark版本不兼容,导致类加载失败(如
InvalidMountException找不到)。 - 本地MLflow配置或认证缺失,导致无法正确访问Databricks存储。
解决步骤
1. 替换日志模型的API
放弃使用mlflow.spark.log_model,改用先本地临时保存模型,再通过MLflow客户端日志的方式,避免本地Spark与Databricks存储的兼容性问题:
import tempfile import mlflow from mlflow.models.signature import infer_signature mlflow.set_tracking_uri("databricks") mlflow.set_experiment("/Users/xxxxx/experiment_name") with mlflow.start_run(run_name="my_run") as run: # 临时保存模型到本地目录 with tempfile.TemporaryDirectory() as tmp_dir: my_spark_model.save(tmp_dir) # (可选)生成模型签名,用于模型注册表的类型校验 signature = infer_signature(test_data, my_spark_model.transform(test_data)) # 日志模型到Databricks mlflow.log_model( artifact_path="my_model", path=tmp_dir, model_type="spark", signature=signature ) # (可选)将日志的模型注册到Databricks模型注册表 mlflow.register_model( model_uri=f"runs:/{run.info.run_id}/my_model", name="your_registry_model_name" )
2. 匹配Databricks Connect与集群版本
确保本地安装的databricks-connect版本与Databricks集群的Spark版本完全一致,版本不匹配会引发类找不到、序列化失败等问题。
3. 处理Windows路径问题
避免手动拼接路径时混合使用\和/,借助Python标准库(如tempfile)自动生成兼容路径,减少路径解析错误。
4. 验证MLflow配置
检查本地~/.databrickscfg文件,确保已配置对应Databricks工作区的认证信息(包括instance URL和个人访问token),保证MLflow客户端能正常连接到Databricks。
内容的提问来源于stack exchange,提问作者itscarlayall

