如何将Azure Databricks训练作业生成的.pkl文件导出至Azure DevOps并发布为工件?
没问题,我帮你把这个流程拆解清楚,不管是你特定的.pkl文件导出需求,还是通用的Databricks文件转存到ADO的场景,都可以按下面的步骤来操作:
1. 先在Notebook里把.pkl文件存到持久化存储
Databricks作业运行的节点是临时的,作业结束后本地文件会丢失,所以第一步要在Notebook的训练代码末尾,把生成的.pkl文件复制到**DBFS(Databricks文件系统)**或者Azure存储(ADLS Gen2/BLOB)。比如存到DBFS的代码:
# 假设你的.pkl文件生成在本地临时路径/tmp下 dbutils.fs.cp("file:/tmp/trained_model.pkl", "dbfs:/models/trained_model.pkl")
2. 在Azure DevOps Pipeline中配置Databricks CLI环境
在ADO的流水线里,先安装并配置Databricks CLI,用来和Databricks workspace交互。可以用Bash任务实现:
# 安装Databricks CLI pip install databricks-cli # 用token认证(建议把token存在ADO的变量组/密钥 vault里,不要硬编码) echo $(DATABRICKS_TOKEN) | databricks configure --token --host https://<your-databricks-workspace-url>
3. 提交作业并等待完成,然后下载文件到ADO代理
首先提交你的Notebook作业,然后轮询作业状态,确保成功完成后再下载文件:
# 提交作业,获取运行ID(替换成你的作业ID) RUN_ID=$(databricks jobs run-now --job-id <your-job-id> | jq -r '.run_id') # 轮询作业状态,直到终止 while true; do RUN_STATUS=$(databricks runs get --run-id $RUN_ID | jq -r '.state.life_cycle_state') if [[ "$RUN_STATUS" == "TERMINATED" ]]; then # 检查作业是否成功 RESULT_STATE=$(databricks runs get --run-id $RUN_ID | jq -r '.state.result_state') if [[ "$RESULT_STATE" != "SUCCEEDED" ]]; then echo "Databricks训练作业失败,终止流水线" exit 1 fi break fi echo "作业仍在运行,等待30秒后重试..." sleep 30 done # 从DBFS下载.pkl文件到ADO代理的本地目录 databricks fs cp dbfs:/models/trained_model.pkl ./trained_model.pkl
注意:如果ADO代理没有jq工具,需要先安装(比如Ubuntu用apt-get install jq,macOS用brew install jq)
4. 将文件发布为Azure DevOps工件
最后用ADO的内置任务把下载好的.pkl文件发布为工件,方便后续使用:
- task: PublishBuildArtifacts@1 inputs: PathtoPublish: './trained_model.pkl' ArtifactName: 'ml-model-artifacts' publishLocation: 'Container'
根据文件的存储位置,有几种不同的处理方式:
方式1:文件存储在DBFS
和上面的.pkl场景一致,核心是用databricks fs cp命令把文件从DBFS下载到ADO代理,再发布工件。如果是整个目录,可以加--recursive参数:
databricks fs cp --recursive dbfs:/models/ ./local-models-dir/
方式2:文件存储在Azure Storage(ADLS Gen2/BLOB)
这种情况可以跳过Databricks CLI,直接用ADO的Azure File Copy任务或者Azure CLI命令下载文件到代理,效率更高。比如用Azure CLI:
# 下载单个文件 az storage blob download --container-name <your-container> --name models/trained_model.pkl --file ./trained_model.pkl --account-name <storage-account-name> # 下载整个目录 az storage blob download-batch --source <your-container> --destination ./local-models-dir --pattern models/*
前提是ADO的服务主体拥有该存储账户的读取权限
方式3:文件仅存在于Databricks临时节点
这种情况必须先在Notebook里把文件复制到DBFS或Azure Storage(参考步骤1),因为作业结束后临时节点会被销毁,文件会永久丢失,无法直接下载。
- 安全性:所有敏感信息(Databricks token、Azure存储密钥等)都要存在ADO的变量组或Azure Key Vault中,绝对不要硬编码在流水线脚本里。
- 作业状态校验:一定要等待作业成功完成后再下载文件,避免获取到不完整或错误的文件。
- 大文件优化:如果文件很大,建议优先用Azure Storage直接同步,避免通过Databricks CLI中转,提高传输效率。
内容的提问来源于stack exchange,提问作者Anirban Saha

