Azure Databricks跨Notebook迁移Python虚拟环境的可行方案咨询
首先明确两个核心问题的结论:
- 不需要在每个Notebook中逐行单独安装依赖
- 完全支持通过
requirements.txt(conda对应environment.yml)实现依赖批量安装
目前生产环境验证过的可靠方案按推荐优先级排序如下:
集群级初始化脚本方案(最通用的生产首选)
这个方案是Databricks官方推荐的替代跨Notebook迁环境的标准做法,挂载到对应集群的所有Notebook会默认共享预装的统一环境,不需要在Notebook里写任何安装逻辑。
操作流程:- 把所有Python依赖按标准格式写到
requirements.txt文件,conda依赖就写到environment.yml,上传到DBFS存储,常规存放路径为dbfs:/databricks/scripts/ - 写一个bash格式的集群初始化脚本,存到同个DBFS路径下,pip依赖对应的脚本内容参考:
#!/bin/bash /databricks/python/bin/pip install -r /dbfs/databricks/scripts/requirements.txt如果用conda依赖,替换成对应的
conda env update命令读取yml文件即可。
3. 在集群配置页的「高级选项-初始化脚本」里添加刚才上传的脚本路径,保存后重启集群,后续集群每次启动都会自动批量安装所有锁定版本的依赖,从根源上避免Notebook之间的环境不一致问题。- 把所有Python依赖按标准格式写到
公共配置Notebook方案(适合临时分析、多环境隔离场景)
如果不想修改集群全局配置,或者同一个集群需要给不同项目跑不同版本依赖的任务,可以用这个方案:- 单独建一个环境配置专用的Notebook,里面只写依赖安装逻辑,直接读取DBFS上的requirements文件批量安装即可,代码如下:
%pip install -r /dbfs/databricks/scripts/requirements.txt注意现在Databricks已经统一推荐用
%pip魔法命令替代旧的%conda命令做会话级包管理,%pip安装的包仅对当前Spark会话生效,不同任务之间的环境不会互相干扰。
2. 其他所有业务Notebook在开头加一行%run /路径/到/你的/环境配置Notebook,运行时就会自动先执行依赖安装,不需要每个Notebook重复写安装命令。
旧的%conda env export、%conda env update现在仅支持当前Notebook会话内的操作,不再支持跨Notebook的环境导出导入,不建议在新流程里继续用这两个命令做环境迁移。自定义Docker基础镜像方案(适合高合规、高一致性要求场景)
如果你的依赖包含大量系统级组件,或者有严格的版本审计要求,可以直接基于Databricks官方提供的运行时基础镜像,把所有Python依赖、系统依赖提前打包构建成自定义Docker镜像,集群启动时直接选用这个自定义镜像作为运行环境,所有Notebook启动时依赖已经预装完成,不需要运行时执行任何安装操作,环境一致性是所有方案里最高的。
注意事项
- 尽量不要在业务Notebook里零散写单包的
%pip install xxx命令,时间长了很容易出现版本冲突、依赖缺失的问题,所有依赖统一维护在带版本锁定的requirements文件里是最稳妥的做法。 - 用
%pip做会话级安装时,安装完成后不需要重启集群,当前会话直接生效;修改集群初始化脚本、更换自定义Docker镜像后,需要重启集群才能让配置生效。
内容的提问来源于stack exchange,提问作者user1700890

