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

Azure Machine Learning Studio中DatabricksStep添加输入输出参数后管道构建失败的修复请求

修复Azure ML DatabricksStep管道构建与文件写入问题

我来帮你排查和修复这个问题,咱们一步步来解决:

1. 笔记本脚本的核心问题

你的Python脚本里有几个明显的问题,会导致参数获取异常和文件写入失败:

  • 重复调用dbutils.widgets.get("output"),冗余且可能引发参数读取异常
  • 混合使用dbutils.widgets.get和getArgument两种参数获取方式,在AMLS触发的DatabricksStep中,应该统一用dbutils.widgets.get来获取传递的参数
  • 用%%writefile在脚本内生成文件是多余的——因为source_directory会直接把脚本上传到Databricks执行,不需要再额外写入一次
  • Spark写入CSV默认会生成多个分区文件,如果你需要单个输出文件,可以添加coalesce(1)来合并,同时要确保路径是集群可访问的Blob存储路径

修复后的笔记本脚本(basic_DatabricksStep_script.py)

# 获取输入参数
input_path = dbutils.widgets.get("input")
print(f"Param - 'input': {input_path}")

# 获取输出参数
output_path = dbutils.widgets.get("output")
print(f"Param - 'output': {output_path}")

# 创建测试数据并指定列名
data = [('value1', 'value2')]
df2 = spark.createDataFrame(data, schema=["col1", "col2"])

# 写入CSV到指定路径(合并为单个文件,覆盖已有内容)
output_full_path = f"{output_path}/output.txt"
df2.coalesce(1).write.mode("overwrite").csv(output_full_path, header=True)

2. DatabricksStep配置的关键缺失

你的DatabricksStep定义里没有传递notebook_params参数——这是把PipelineData的路径传递给笔记本的核心环节,另外需要确保输出的PipelineData配置正确的访问模式:

修复后的DatabricksStep代码

def_blob_store = Datastore(ws, "input_datastore")
step_1_input = DataReference(datastore=def_blob_store, path_on_datastore="dbtest", data_reference_name="input")

output_data_folder_name = "output"
output_data_folder = PipelineData(
    output_data_folder_name, 
    datastore=Datastore.get(ws, "output_datastore"),
    output_mode="mount"  # 确保以挂载方式访问Blob存储,让Databricks集群可读写
)

dbNbWithExistingClusterStep = DatabricksStep(
    name="DBFSReferenceWithExisting",
    run_name='DBFS_Reference_With_Existing',
    source_directory=source_directory,
    python_script_name="basic_DatabricksStep_script.py",
    inputs=[step_1_input],
    outputs=[output_data_folder],
    compute_target=databricks_compute,
    existing_cluster_id="XXXXXX",
    allow_reuse=True,
    permit_cluster_restart=True,
    # 关键:添加notebook_params,把输入输出路径映射到笔记本的widget参数
    notebook_params={
        "input": step_1_input.path_on_datastore,
        "output": output_data_folder.path_on_datastore
    }
)

3. 额外的验证点

  • 确保你的Databricks集群已经能访问AML工作区关联的Blob存储(AMLS通常会自动挂载Datastore,但可以手动在集群上验证路径可访问)
  • 检查output_datastore对应的Blob容器权限,确保AML服务主体有写入权限
  • 如果集群是新创建的,确认已安装azureml-core等必要依赖(AMLS一般会自动配置,若有缺失可手动在集群上安装)

这样修改后,管道应该能正常构建,DatabricksStep执行时也会成功将文件写入指定的Blob存储容器中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:32:31