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

