Apache DolphinScheduler Jupyter 任务完整实战指南:基于 Papermill 的 Notebook 自动化执行与 Conda 环境管理

发布时间:2026/11/15 1:39:38

Apache DolphinScheduler Jupyter 任务完整实战指南:基于 Papermill 的 Notebook 自动化执行与 Conda 环境管理 Apache DolphinScheduler Jupyter 任务完整实战指南基于 Papermill 的 Notebook 自动化执行与 Conda 环境管理【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinschedulerJupyter 任务Jupyter Task是 Apache DolphinScheduler 内置的数据科学类任务插件它让工作流能够以任务节点的形式直接驱动 Jupyter Notebook 的批量化执行。本指南围绕该插件的安装前提Conda 配置、三种 Python 依赖管理方式预装环境 / Conda-Pack 打包环境 / requirements.txt 动态构建、任务参数与创建流程展开并结合仓库源码剖析其底层命令生成逻辑帮助读者在 DolphinScheduler 中稳定、可复用地运行 Notebook 分析任务。一、任务概述Worker 如何执行 Jupyter Notebook在 DolphinScheduler 中Jupyter Task用于创建 jupyter 类型的任务节点并执行 Jupyter Notebook。当 Worker 执行该任务时会调用 papermill 来评估evaluateJupyter Notebookpapermill 接收一个输入 Notebook 模板将参数化单元格中的变量注入后逐单元格执行最终产出带结果的输出 Notebook 文件。从源码看Jupyter 任务被实现为一个标准插件插件入口位于 JupyterTaskChannel.java它负责把任务参数 JSON 反序列化为 JupyterParameters.java 并创建 JupyterTask.java 实例。任务运行时通过ShellCommandExecutor在 Worker 上执行一段拼接好的 shell 命令命令的核心形态为papermill [OPTIONS] NOTEBOOK_PATH [OUTPUT_PATH]该命令的完整拼装逻辑见 JupyterTask.buildCommand()下文会结合这段实现逐步讲解每个参数的去向。二、前提配置Conda 环境Jupyter 任务插件依赖 conda 来管理和激活 Python 环境因此必须先在 Worker 节点上正确配置conda.path在common.properties中配置conda.path指向你的conda.sh脚本路径该 conda 必须与你管理papermill和jupyter所用的 Python 环境是同一个 conda。conda.path的默认值为/opt/anaconda3/etc/profile.d/conda.sh。如果你不确定 conda 安装在哪里可直接执行conda info | grep -i base environment输出的路径即为你需要填写的值。仓库中的默认配置文件 dolphinscheduler-common/src/main/resources/common.properties 第 91 行正是# set path of conda.sh conda.path/opt/anaconda3/etc/profile.d/conda.sh从源码实现看插件在构建命令时通过PropertyUtils.getString(TaskConstants.CONDA_PATH)读取该配置见 JupyterTask.readCondaPath()其中CONDA_PATH常量定义在 TaskConstants.javapublic static final String CONDA_PATH conda.path;⚠️注意事项Jupyter Task Plugin使用source命令来激活 conda 环境。如果执行任务所用的租户tenant没有使用source的权限Jupyter Task Plugin将无法正常工作。这一点在 JupyterConstants.java 中体现为CONDA_INIT source、CONDA_ACTIVATE conda activate即以source conda.sh初始化 shell 后再激活环境。三、Python 依赖管理三种方式任选插件支持三种 Python 依赖管理方式最终都会落到condaEnvName参数上从源码看插件正是通过判断condaEnvName的后缀.tar.gz/.txt/ 其他来决定走哪条执行路径见 JupyterTask.buildCommand()。3.1 方式一使用预装的 Conda 环境在目标 Worker 上手动或通过shell task创建一个 conda 环境在jupyter task中把condaEnvName设置为该 conda 环境的名称。此时插件生成的命令形如source /opt/anaconda3/etc/profile.d/conda.sh conda activate jupyter-lab papermill ...3.2 方式二使用 Conda-Pack 打包的环境使用 Conda-Pack 将你的 conda 环境打包成tarball通常为.tar.gz将打包好的 conda 环境上传到资源中心Resource Center在jupyter task中把condaEnvName设置为打包环境的文件名例如jupyter_env.tar.gz在jupyter task的resource中选择该打包环境文件例如jupyter_env.tar.gz。⚠️ 请严格按照 Conda-Pack 官方说明进行打包。解包后打包环境的目录结构应当与下面一致. ├── bin ├── conda-meta ├── etc ├── include ├── lib ├── share └── ssl⚠️特别注意请严格遵循上述conda pack指令不要修改bin/activate。Jupyter Task Plugin使用source命令激活打包的 conda 环境如果你对使用source有顾虑请选择其他方式来管理 Python 依赖。源码中对应执行逻辑在 JupyterConstants.java打包环境被解压到jupyter_env目录后直接激活mkdir jupyter_env tar -xzf %s -C jupyter_env source jupyter_env/bin/activate生成的完整命令类似source /opt/anaconda3/etc/profile.d/conda.sh mkdir jupyter_env tar -xzf jupyter.tar.gz -C jupyter_env source jupyter_env/bin/activate papermill ...3.3 方式三从 requirements.txt 构建环境在资源中心上传或创建一个包含 Python 依赖的.txt文件在jupyter task中把condaEnvName设置为该 requirements 文件名例如requirements.txt在jupyter task的resource中选择该文件例如requirements.txt。插件会自动据此构建 Python 依赖环境 → 运行你的 Python 代码 → 最终拆除tear down该环境。下面是文档给出的一份 requirements 示例文件其中包含 papermill 及其 Notebook 运行所需的完整依赖链fastjsonschema2.15.3 fonttools4.33.3 geojson2.5.0 identify2.4.11 idna3.3 importlib-metadata4.11.3 importlib-resources5.7.1 ipykernel5.5.6 ipython8.2.0 ipython-genutils0.2.0 jedi0.18.1 Jinja23.1.1 json50.9.6 jsonschema4.4.0 jupyter-client7.3.0 jupyter-core4.10.0 jupyter-server1.17.0 jupyterlab3.3.4 jupyterlab-pygments0.2.2 jupyterlab-server2.13.0 kiwisolver1.4.2 MarkupSafe2.1.1 matplotlib3.5.2 matplotlib-inline0.1.3 mistune0.8.4 nbclassic0.3.7 nbclient0.6.0 nbconvert6.5.0 nbformat5.3.0 nest-asyncio1.5.5 notebook6.4.11 notebook-shim0.1.0 numpy1.22.3 packaging21.3 pandas1.4.2 pandocfilters1.5.0 papermill2.3.4从源码看当condaEnvName以.txt结尾时插件先以set e忽略错误继续执行EXECUTION_FLAG然后依次执行创建临时环境、激活、安装依赖、运行 papermill、最后拆除环境的命令见 JupyterConstants.javaconda create -n jupyter-tmp-env-timestamp -y conda activate jupyter-tmp-env-timestamp pip install -r requirements.txt # ... 执行 papermill ... conda deactivate conda remove --name jupyter-tmp-env-timestamp --all -y其中timestamp由DateUtils.getTimestampString()生成用于保证临时环境名的唯一性见 JupyterTask.buildCommand()。四、创建任务在 DAG 中拖入 Jupyter 节点进入项目管理 → 项目名称 → 工作流定义点击创建工作流按钮进入 DAG 编辑页面从工具栏将 Jupyter 图标拖拽到画布中。拖入后即可在右侧面板填写任务参数然后保存、上线并运行该工作流。关于任务创建、运行、停止、删除等通用操作可参考任务参数附录 appendix.md 中Default Task Parameters一节默认任务参数部分本文不再赘述。五、任务参数详解Jupyter 任务的业务参数如下表所示参数说明Conda Env Nameconda 环境名称或打包的 conda 环境 tarball 文件名.tar.gz或 requirements 文件.txtInput Note Path输入 Jupyter Notebook 模板的路径Out Note Path输出 Notebook 文件的路径Jupyter ParametersJSON 格式的参数用于对 Jupyter Notebook 做参数化注入参数单元格KernelJupyter Notebook 使用的 kernelEngine用于评估 Jupyter Notebook 的执行引擎Jupyter Execution Timeout每个 Jupyter Notebook 单元格的执行超时时间Jupyter Start TimeoutJupyter Notebook kernel 的启动超时时间Otherspapermill 的其他命令行选项这些参数在 JupyterParameters.java 中一一对应。其中有三个必填项——checkParameters()方法要求condaEnvName、inputNotePath、outputNotePath均非空见 JupyterParameters.java否则JupyterTask.init()会抛出 jupyter task params is not valid 异常。参数如何映射为 papermill 命令结合 JupyterTask.populateJupyterParameterization() 与 JupyterTask.populateJupyterOptions()各参数与 papermill 命令行参数的对应关系如下Jupyter Parameters以 JSON 字符串形式传入如{city: Shanghai, factor: 0.01}插件使用 JacksonObjectMapper解析为MapString, String后逐个键值对拼成--parameters key value追加到命令中JSON 解析失败会直接导致任务失败。Kernel非空时追加--kernel kernelpapermill 的--kernel指定运行内核Engine非空时追加--engine engine指定执行引擎Jupyter Execution Timeout非空时追加--execution-timeout seconds即每个单元格执行等待秒数默认永久等待Jupyter Start Timeout非空时追加--start-timeout seconds即 kernel 启动等待秒数Others原样追加为 papermill 的额外命令行选项插件始终会追加两个固定选项--inject-paths将输入/输出 Notebook 路径以PAPERMILL_INPUT_PATH/PAPERMILL_OUTPUT_PATH注入为 Notebook 参数与--progress-bar开启进度条。上述常量定义可参见 JupyterConstants.java。六、任务示例与底层命令还原下图展示了在 DAG 画布中配置一个 Jupyter 任务节点的效果要直观理解三种依赖管理方式最终会生成什么样的真实命令最可靠的证据是插件自带的单元测试 JupyterTaskTest.java。它通过断言buildCommand()的输出来验证命令拼装逻辑本地 conda 环境condaEnvNamejupyter-labsource /opt/anaconda3/etc/profile.d/conda.sh conda activate jupyter-lab papermill /test/input_note.ipynb /test/output_note.ipynb --parameters city Shanghai --parameters factor 0.01 --kernel python3 --engine default_engine --execution-timeout 10 --start-timeout 3 --version --inject-paths --progress-bar打包 conda 环境condaEnvNamejupyter.tar.gzsource /opt/anaconda3/etc/profile.d/conda.sh mkdir jupyter_env tar -xzf jupyter.tar.gz -C jupyter_env source jupyter_env/bin/activate papermill /test/input_note.ipynb /test/output_note.ipynb --parameters city Shanghai --parameters factor 0.01 --kernel python3 --engine default_engine --execution-timeout 10 --start-timeout 3 --version --inject-paths --progress-barrequirements.txt 动态构建condaEnvNamerequirements.txt临时环境名被固定为123456789以便断言set e source /opt/anaconda3/etc/profile.d/conda.sh conda create -n jupyter-tmp-env-123456789 -y conda activate jupyter-tmp-env-123456789 pip install -r requirements.txt papermill /test/input_note.ipynb /test/output_note.ipynb --parameters city Shanghai --parameters factor 0.01 --kernel python3 --engine default_engine --execution-timeout 10 --start-timeout 3 --version --inject-paths --progress-bar conda deactivate conda remove --name jupyter-tmp-env-123456789 --all -y从这三组命令可以完整还原插件的执行链路初始化 conda → 按依赖管理方式激活/构建环境 → 执行 papermill参数注入、超时、kernel/engine、额外选项→ 若是临时环境则自动拆除。这也解释了为什么文档要求 Worker 租户必须拥有source权限——命令的第一行就是对conda.sh执行source。七、常见问题与排障建议任务报 jupyter task params is not validcondaEnvName、inputNotePath、outputNotePath三者任一为空都会触发该校验请检查任务参数是否完整填写。任务执行提示source: command not found或权限不足插件依赖source激活环境请确认执行任务所使用的租户账号对该 Worker 拥有source权限。找不到 conda 或环境激活失败确认common.properties中conda.path指向真实存在的conda.sh且该 conda 与安装 papermill/jupyter 的环境一致可执行conda info | grep -i base environment核对路径。打包环境无法激活检查是否按 Conda-Pack 官方流程打包且未改动bin/activate解包后的目录结构应与第三节所示一致。临时环境残留requirements 方式使用jupyter-tmp-env-timestamp命名临时环境任务结束后会自动conda remove若任务中途被强杀导致残留可在 Worker 上手动清理对应环境。八、结语Jupyter 任务把 DolphinScheduler 的工作流编排能力与 Jupyter Notebook 的交互式分析生态连接在一起通过 papermill 实现 Notebook 参数化批量执行通过三种 conda 依赖管理策略覆盖复用预装环境 / 分发打包环境 / 按依赖清单动态构建三类典型场景。结合本仓库源码中的 JupyterTask.java、JupyterConstants.java 与单元测试 JupyterTaskTest.java你可以清晰地预见每一步配置在 Worker 上实际执行的命令从而更从容地完成 Notebook 任务的调试、治理与运维。【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/15 1:39:37

OpenSEO 2026路线图:开源SEO工具即将推出的新功能全解读

OpenSEO 2026路线图:开源SEO工具即将推出的新功能全解读 【免费下载链接】open-seo Open source alternative to Semrush and Ahrefs 项目地址: https://gitcode.com/GitHub_Trending/op/open-seo OpenSEO 是一款开源的 SEO 工具,定位是 Semrush …

2026/11/15 1:39:37

如何用 yq 的 pick 按指定顺序保留映射键并用 omit 剔除键

如何用 yq 的 pick 按指定顺序保留映射键并用 omit 剔除键 【免费下载链接】yq yq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor 项目地址: https://gitcode.com/GitHub_Trending/yq/yq 处理 YAML 文件时经常遇到这样的需求&a…

2026/10/25 6:02:05

Topaz Photo AI闪退蓝屏问题诊断与解决方案

1. 问题现象与初步诊断遇到Topaz Photo AI 4.0.1闪退后蓝屏的问题时,我首先注意到这是一个典型的软件与系统兼容性冲突案例。从技术角度看,这类问题通常涉及三个层面的交互异常:应用程序自身缺陷、显卡驱动兼容性问题以及系统内存管理故障。在…

2026/11/15 1:37:55

电工证挂靠做什么内部消息你必须知道

电工证挂靠做什么内部消息你必须知道 怕考不过白交培训费,别再被培训机构忽悠了,今天给你讲讲电工证挂靠到底能干啥,还有内部消息告诉你报考前必须知道的那些事。 电工证挂靠做什么?别再花冤枉钱了…

2026/11/15 1:37:55

特种作业证报考指南:我是特种兵唐工扮演者如何通过率揭秘

特种作业证报考指南:我是特种兵唐工扮演者如何通过率揭秘 你是不是也担心学历不高,报不了特种作业证?其实不然,只要符合基本条件,哪怕初中毕业也能报考,关键是要掌握报名流程和备考技巧。特别是像“我是特种兵唐工扮演者”这样的角色,虽然不直接对应现…

2026/11/15 1:37:55

电工证属于几级职称的多少钱怎么考更稳妥

电工证属于几级职称的多少钱怎么考更稳妥 实操考试心里没底怕挂科,这是很多准备报考电工证的学员最真实的心理写照。尤其是在当前电工行业门槛逐渐提高的背景下,持证上岗已经成为行业标配。但很多人对电工证到底是几级职称、考试难度、费用怎么算、未来能走…

2026/11/15 1:37:55

阆中在哪里考电工证?工地太忙根本没时间复习考试怎么办

阆中在哪里考电工证?工地太忙根本没时间复习考试怎么办 工地太忙根本没时间复习考试,你是不是也这样?尤其是像安阳的应届毕业生,刚毕业就投入到项目一线,根本没有多余的时间去准备电工证考试,更别说找到【在哪考】的地方了。今天就来聊聊【阆中在哪里考…

2026/11/15 1:37:55

电工证怎么考怎么分级良心建议来了 老电工教你少走弯路

电工证怎么考怎么分级良心建议来了 老电工教你少走弯路 证书过期了不知道怎么复审延期?别慌,你不是一个人在战斗,很多人在考电工证的路上都踩过坑,尤其是那些证书快到期却不知道怎么操作的兄弟。今天就从 驻马店项目现场管理员 的角度,结合…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑