受保护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
相关产品推荐
相关产品推荐

