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

受保护Azure Blob URL无法被mlflow.data.from_pandas解析的解决方案咨询

解决受保护Azure Blob存储的MLflow数据集注册警告问题

问题背景

从Yahoo Finance获取时序数据后,将其保存到需通过连接字符串访问的Azure Blob存储,转换为Pandas DataFrame后使用mlflow.log_input进行跟踪。但调用mlflow.data.from_pandas并传入Blob URL作为source参数时,MLflow的数据源注册表无法解析受保护的URI,抛出以下警告:

C:\ProgramData\miniconda3\envs\mlflow-spark\Lib\site-packages\mlflow\data\dataset_source_registry.py:150: UserWarning: Failed to determine whether UCVolumeDatasetSource can resolve source information for 'https://<storagename>.blob.core.windows.net/<container>/<filename>.csv'. Exception:
  return _dataset_source_registry.resolve(

需要找到既能正确注册受保护URI,又无需屏蔽警告的解决方案。


解决方案

方法1:显式使用Azure Blob数据源类型

MLflow提供了专门的Azure Blob数据源类AzureBlobDatasetSource,可以直接传入连接字符串或SAS Token,让数据源注册表正确识别并解析,避免警告。

from mlflow.data.azure_blob_dataset_source import AzureBlobDatasetSource

# 在上传Blob后,创建AzureBlobDatasetSource实例
source = AzureBlobDatasetSource(
    path=blob_client_url,
    azure_storage_connection_string=_credentials.AZURE_STORAGE_CONNECTION_STRING
)

# 创建数据集并进行日志记录
dataset = mlflow.data.from_pandas(
    data_df,
    source=source,
    name=f"{stock_ticker}_{input_or_pred}_{train_or_test}"
)

mlflow.log_input(dataset, context=train_or_test_or_all)

适用场景:需要完整追踪数据源,且希望保留Blob原有访问控制策略的场景。

方法2:省略source参数,手动记录元数据

如果不需要MLflow自动追踪数据源的Blob来源,可以省略source参数,转而使用mlflow.log_param或mlflow.log_dict手动记录Blob的相关信息,完全避免数据源解析流程。

# 创建数据集时不指定source
dataset = mlflow.data.from_pandas(
    data_df,
    name=f"{stock_ticker}_{input_or_pred}_{train_or_test}"
)

mlflow.log_input(dataset, context=train_or_test_or_all)

# 手动记录Blob的元信息
mlflow.log_param("blob_url", blob_client_url)
mlflow.log_param("storage_container", _credentials.storage_container_name)
mlflow.log_param("blob_directory", _credentials.blob_directory)

适用场景:不需要数据源自动解析,仅需记录数据相关元信息的轻量化场景。

方法3:生成带SAS Token的可访问URL

为Blob生成一个带有有效期的SAS Token,将其拼接在Blob URL后作为source传入,让MLflow能解析这个临时可访问的URL,同时通过SAS Token控制访问权限和有效期。

from azure.storage.blob import generate_blob_sas, BlobSasPermissions
from datetime import datetime, timedelta

# 生成SAS Token(需提前获取存储账户名称和密钥)
sas_token = generate_blob_sas(
    account_name=_credentials.AZURE_STORAGE_ACCOUNT_NAME,
    container_name=f"{_credentials.storage_container_name}/{_credentials.blob_directory}",
    blob_name=blob_name,
    account_key=_credentials.AZURE_STORAGE_ACCOUNT_KEY,
    permission=BlobSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=24)  # 设置24小时有效期
)

# 拼接带SAS Token的Blob URL
sas_blob_url = f"{blob_client_url}?{sas_token}"

# 创建数据集并日志记录
dataset = mlflow.data.from_pandas(
    data_df,
    source=sas_blob_url,
    name=f"{stock_ticker}_{input_or_pred}_{train_or_test}"
)

mlflow.log_input(dataset, context=train_or_test_or_all)

适用场景:允许Blob临时公开访问,且需要MLflow完整解析数据源的场景。


内容的提问来源于stack exchange,提问作者Sergio Solorzano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:47:35