Spark Connect环境下MLflow日志模型报错求助
问题
环境配置
- 搭载Spark Connect 4.0.1的Kubernetes集群
- MLflow tracking server 3.5.0
MLflow Tracking Server配置
--backend-store-uri=postgresql:// --artifacts-destination=<s3 bucket> --serve-artifacts
本地运行PySpark脚本连接集群后,模型训练和参数日志功能正常,但执行mlflow.spark.log_model(model, "model")时抛出异常:
UnknownException: (org.apache.hadoop.fs.UnsupportedFileSystemException) No FileSystem for scheme "mlflow-artifacts"JVM stacktrace: org.apache.hadoop.fs.UnsupportedFileSystemException at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3581) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3612) at org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:172) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3716) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3667) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:557) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:366) at org.apache.spark.sql.execution.datasources.DataSource.makeQualified(DataSource.scala:125) at org.apache.spark.sql.execution.datasources.DataSource.planForWritingFileFormat(DataSource.scala:468) at org.apache.spark.sql.execution.datasources.DataSource.planForWriting(DataSource.scala:554) at org.apache.spark.sql.classic.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:273) at org.apache.spark.sql.classic.DataFrameWriter.saveInternal(DataFrameWriter.scala:241) at org.apache.spark.sql.classic.DataFrameWriter.save(DataFrameWriter.scala:118) at org.apache.spark.sql.connect.planner.SparkConnectPlanner.handleWriteOperation(SparkConnectPlanner.scala:2954)
需求:不想让Spark直接访问MLflow背后的S3存储桶,解决通过Spark Connect向MLflow日志模型的问题。
解决方案
核心原因
使用mlflow.spark.log_model时,默认会让Spark集群直接写入MLflow的制品存储(此处为S3),但你的配置是让MLflow Server托管制品(--serve-artifacts),且Spark集群缺少mlflow-artifacts协议的FileSystem实现,因此抛出异常。
方法1:本地序列化模型后上传(推荐,无需修改Spark集群)
跳过Spark集群直接写入流程,改为在本地脚本中完成模型序列化与上传:
- 从Spark Connect获取模型的本地引用:
# 将Spark Connect中的模型转为本地可序列化格式 local_model = model.to_local()
- 通过本地MLflow客户端日志模型:
import mlflow # 配置本地客户端指向你的MLflow Tracking Server mlflow.set_tracking_uri("http://your-mlflow-server-address") # 日志模型,此时由本地客户端将制品上传至MLflow Server,无需Spark集群访问S3 mlflow.spark.log_model(local_model, "model")
方法2:为Spark集群添加MLflow Hadoop FileSystem依赖
若必须由Spark集群处理写入操作,需在Kubernetes上的Spark Driver/Executor中添加MLflow的Hadoop FileSystem包:
- 确保使用与MLflow版本匹配的
mlflow-hadoop-fsjar包(此处为3.5.0版本) - 在Spark Submit或Spark Connect的配置中添加依赖:
--packages org.mlflow:mlflow-hadoop-fs:3.5.0
或在Kubernetes的Spark Pod模板中,将该jar包挂载至Spark的classpath目录下。
完成配置后,Spark集群即可识别mlflow-artifacts协议,通过MLflow Server间接访问S3存储桶。
内容的提问来源于stack exchange,提问作者hage
相关产品推荐
相关产品推荐

