Apache DolphinScheduler 任务参数完整指南:默认任务参数与资源配额机制深度解析
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler
本指南以 Apache DolphinScheduler 的任务参数附录(Task Parameters Appendix)为核心,系统讲解工作流中每个任务节点通用的默认参数——从节点名称、运行标志、任务优先级到 CPU 配额、内存上限、超时告警与延迟执行等 15 项核心配置。文章不仅逐项说明每个参数的含义、取值范围与配置方式,还结合仓库源码揭示任务定义的数据模型、资源配额在 Worker 端的底层实现机制,帮助你准确配置任务节点、避免资源滥用,并为任务调度排障提供源码级依据。
一、任务参数附录概述
在 DolphinScheduler 中,每一种任务插件(Shell、SQL、Python、DataX、Flink、Spark 等)都共享一组通用默认参数。这组参数定义在 docs/docs/en/guide/task/appendix.md,是理解任务节点配置的基础。
关键点在于:不同类型的任务会包含这组默认参数中的全部或部分参数。例如,Shell 任务与 SQL 任务的参数面板会有差异,但它们都遵循同一套默认参数语义。这些参数最终会随任务定义一起持久化到数据库中,并在任务调度执行时被 Worker 读取使用。
从源码结构看,这组默认参数正是t_ds_task_definition表的字段映射。在 TaskDefinition.java 中,任务定义实体被@TableName("t_ds_task_definition")注解映射到对应数据库表,其中name(节点名称)、description(描述)、flag(运行标志)、taskPriority(任务优先级)、workerGroup(Worker 分组)、failRetryTimes(失败重试次数)、failRetryInterval(失败重试间隔)、timeout(超时时间)、delayTime(延迟执行时间)、cpuQuota(CPU 配额)、memoryMax(最大内存)等字段一一对应附录中列出的默认参数。
二、任务通用默认参数逐项详解
下表完整列出了附录中的全部默认参数及其官方释义:
| 参数 | 说明 |
|---|---|
| Node Name | 任务节点的名称。同一工作流内节点名称必须唯一。 |
| Run Flag | 是否调度执行该任务。若无需执行该任务,可打开"禁止执行"开关。 |
| Description | 描述该节点的功能。 |
| Task Priority | 当 Worker 线程数不足时,Worker 按优先级执行任务;两个任务优先级相同时,按"先来先服务"(first come first served)方式执行。 |
| Worker Group | 执行任务的机器(Worker 分组)。选择default时,调度器会将任务随机发送给某个 Worker。 |
| Task Group Name | 任务的资源组。不配置则不生效。 |
| Environment Name | 任务执行所依赖的环境。 |
| Number of Failed Retries | 任务失败时的重试次数。可通过下拉菜单选择或手动填写。 |
| Failure Retry Interval | 任务失败重试的时间间隔。可通过下拉菜单选择或手动填写。 |
| CPU Quota | 为执行的任务分配指定的 CPU 时间配额,取百分比值。默认 -1 表示不限制。例如,单核满载为 100%,16 核满载为 1600%。可通过task.resource.limit.state配置开启,详见架构配置文档。 |
| Max Memory | 为执行的任务分配指定的最大内存,超过该限制会触发 OOM 被杀死,且不会自动重试。取 MB 值。默认 -1 表示不限制。可通过task.resource.limit.state配置开启。 |
| Timeout Alarm | 任务超时告警。当任务超过"超时阈值"时,会发送告警邮件。 |
| Delayed Execution Time | 任务延迟执行的时间,单位为分钟。 |
| Resources | 任务节点所使用的资源文件。 |
| Predecessor Task | 当前任务节点的上游任务。 |
2.1 节点名称(Node Name)与描述
节点名称是任务在 DAG 中的唯一标识,同一工作流内必须唯一,否则工作流定义无法通过校验。描述字段用于说明节点职责,便于团队协作与后期维护。
从数据模型看,name与description均以字符串形式存储于TaskDefinition实体中。此外,TaskDefinition中还有code(任务编码)、version(版本号)字段——DolphinScheduler 对任务定义采用"编码 + 版本"的管理方式,每次修改任务定义都会生成新的版本记录(TaskDefinitionLog),这也是任务可回溯、可回滚的底层机制。
2.2 运行标志(Run Flag)与禁止执行
运行标志控制任务是否参与调度执行。若你暂时不希望某个节点被执行(例如临时下线一个已不再需要的步骤),可以打开"禁止执行"开关。该标志在数据模型中对应TaskDefinition的flag字段,类型为Flag枚举(YES/NO),并持久化到t_ds_task_definition.flag列。处于"禁止执行"状态的任务节点仍保留在工作流定义中,便于日后恢复,而无需重建节点。
2.3 任务优先级(Task Priority)
任务优先级决定资源竞争时的执行顺序:
- 当Worker 线程数不足时,Worker 会依据优先级对排队中的任务进行排序,优先执行高优先级任务;
- 当两个任务的优先级相同时,按照first come first served(先来先服务)的原则执行;
- 该项与 process_priority.png 设计图 展示的工作流级优先级机制不同——此处是任务节点级的优先级,二者分别在 DAG 编排与 Worker 执行两个层面影响调度顺序。
在源码中,TaskDefinition的taskPriority字段类型为Priority枚举(HIGHEST、HIGH、MEDIUM、LOW、LOWEST),优先级语义在任务实例(TaskInstance)层面继承并用于 Worker 端任务队列的排序。
2.4 Worker 分组(Worker Group)
Worker 分组决定了任务由哪些机器执行,是 DolphinScheduler 实现"按需分配计算资源"的核心手段:
- 选择
default分组时,调度器将任务随机发送给该分组内的某个 Worker; - 你可以为不同租户、不同业务或不同资源规格(如高内存机器、GPU 机器)创建独立 Worker 分组,将任务路由到特定机器池,实现资源隔离与负载规划。
在源码中,workerGroup字段存储于任务定义中,调度时会结合 Worker 分组注册信息与分组内 Worker 的负载情况将任务派发到目标 Worker。
2.5 任务组(Task Group Name)与任务组优先级
任务组(Task Group)是 DolphinScheduler 的资源组机制,用于对任务的并发执行数量进行总量控制。配置任务组后,任务会受该组配额约束;不配置则不生效。
与之关联的是TaskDefinition中的taskGroupId与taskGroupPriority字段。任务组机制让多个任务共享一个并发额度池,例如某组最多允许 10 个任务同时运行,超出部分排队等待,从而保护下游系统不被瞬间打满。
2.6 环境名称(Environment Name)
环境用于预置任务运行所需的运行时依赖,例如:
- 自定义的 Python 虚拟环境路径;
- 特定的 JDK 或大数据客户端版本;
- 预先配置的环境变量集合。
任务被派发到 Worker 后,Worker 会加载任务指定的环境(对应environmentCode关联的环境定义),在对应环境中启动任务进程。
2.7 失败重试次数与重试间隔
任务执行失败时,DolphinScheduler 支持自动重试,包含两个参数:
- Number of Failed Retries:失败重试次数,可通过下拉菜单选择或手动填写;
- Failure Retry Interval:两次重试之间的等待间隔。
在数据模型中,二者对应TaskDefinition的failRetryTimes与failRetryInterval字段(int 类型)。这两个参数同时出现在equals()方法中——意味着修改重试策略会导致任务定义版本变化,进而产生新的TaskDefinitionLog记录,便于追溯任务的配置变更历史。
需要注意:附录明确指出,因Max Memory(最大内存)超限被 OOM Kill 的任务不会自动重试,这是重试机制的一个重要例外,配置高内存敏感型任务时务必留意。
2.8 超时告警(Timeout Alarm)
超时告警用于防止任务无限期挂起:
- 当任务执行时间超过设定的超时阈值时,系统会触发超时策略;
- 附录所述为发送告警邮件(
TimeoutFlag开启 + 通知策略选择邮件告警)。
从源码看,超时相关字段包括TaskDefinition中的timeoutFlag(TimeoutFlag枚举,是否启用超时)、timeoutNotifyStrategy(TaskTimeoutStrategy枚举,超时后的处理策略)以及timeout(超时阈值,单位为分钟)。TaskTimeoutStrategy枚举支持多种组合策略,例如仅警告(WARN)、仅失败(FAILED)或警告后失败(WARNFAILED)等,你可以根据任务的重要性选择是"仅告警"还是"告警并终止任务"。
2.9 延迟执行时间(Delayed Execution Time)
延迟执行时间用于将任务在到达调度时间后再推迟指定的分钟数执行,对应TaskDefinition.delayTime字段(int,单位分钟)。典型的应用场景包括:
- 依赖外部系统数据落盘后再执行本任务;
- 错峰执行,避免多个任务在同一时刻抢占资源;
- 模拟"缓冲期",让上游数据有充分的时间流转。
2.10 资源(Resources)与前驱任务(Predecessor Task)
- Resources:指定任务节点运行时需要引用的资源文件(如 UDF 脚本、依赖 jar、SQL 文件等),这些资源由文件管理中心统一管理,任务执行时 Worker 会将其下载到本地。在实体中对应的
resourceIds字段已在源码中被标记为@Deprecated,说明资源关联方式正在向更现代的引用机制演进。 - Predecessor Task:即 DAG 中的上游任务节点。通过为当前节点指定前驱任务,DolphinScheduler 才能构建出有向无环图(DAG),从而在运行时按依赖关系决定任务的启动时机,前驱任务执行完成后当前任务才会进入就绪队列。
三、CPU 配额与内存上限:资源限制的底层实现
附录中,CPU Quota与Max Memory是技术含量最高的两个参数,它们共同构成了 DolphinScheduler 的任务级资源隔离能力,且都与全局开关task.resource.limit.state相关联。
3.1 全局开关:task.resource.limit.state
该开关定义在 common.properties 中:
# Task resource limit state task.resource.limit.state=false- 默认值为
false,即默认不开启任务资源限制; - 当该开关为
false时,CPU Quota 与 Max Memory 配置不生效,任务以无限制方式运行; - 当设置为
true时,Worker 在启动任务时会依据任务配置的 CPU 配额与内存上限构建受限执行环境。
测试资源文件 common.properties 中同样保留了task.resource.limit.state=false的默认值,保证测试环境与生产环境行为一致。
3.2 数据模型与默认值兜底
在任务定义实体 TaskDefinition.java 中,cpuQuota与memoryMax被定义为Integer类型,并通过 getter 方法做默认值兜底:
public Integer getCpuQuota() { return cpuQuota == null ? -1 : cpuQuota; } public Integer getMemoryMax() { return memoryMax == null ? -1 : memoryMax; }即:当数据库中的值为 NULL 时,统一按 -1 处理,与附录中"默认 -1 表示不限制"的语义完全一致。这意味着即使老版本数据没有写入这两个字段,系统也能以"不限制"的兼容行为正常运行。
3.3 Worker 端的 systemd 资源控制实现
任务执行时,任务参数会流转到TaskExecutionContext(见 TaskExecutionContext.java),其中的cpuQuota与memoryMax字段被AbstractCommandExecutor读取,并传递给 Shell 命令构建器:
iShellInterceptorBuilder.cpuQuota(taskRequest.getCpuQuota());核心实现位于 BaseLinuxShellInterceptorBuilder.java 的bootstrapCommandInResourceLimitMode()方法:当资源限制开启时,Worker 会使用sudo systemd-run --scope将任务进程放入独立的 systemd scope 中,并通过控制组(cgroup)参数实施资源上限:
if (cpuQuota == -1) { bootstrapCommand.add("-p"); bootstrapCommand.add("CPUQuota="); // 不限制 } else { bootstrapCommand.add("-p"); bootstrapCommand.add(String.format("CPUQuota=%s%%", cpuQuota)); // 例如 100% } if (memoryQuota == -1) { bootstrapCommand.add("-p"); bootstrapCommand.add(String.format("MemoryLimit=%s", "infinity")); // 不限制 } else { bootstrapCommand.add("-p"); bootstrapCommand.add(String.format("MemoryLimit=%sM", memoryQuota)); // 例如 2048M }由此可以明确几件重要事实:
- CPU 配额的取值为百分比:
CPUQuota=100%表示任务最多占用 1 个 CPU 核心的满载算力;附录中"16 核满载为 1600%"即对应CPUQuota=1600%; - 内存上限的单位为 MB:
MemoryLimit=2048M即限制任务最多使用 2048 MB 内存; - 超限后果不同:CPU 超限只是被节流(throttle),任务继续运行但变慢;而内存超过
MemoryLimit会触发 OOM 被系统杀死,且不会自动重试(与附录说明一致); - 底层依赖 systemd:该实现建立在 Linux systemd 的
systemd-run与 cgroup 资源控制之上(源码注释明确指向man systemd.resource-control),因此资源限制能力在 Linux 系统上生效,运行环境需具备sudo权限与 systemd 支持。
3.4 一个完整的资源限制配置示例
假设你有一个数据清洗任务,希望将它限制在"最多 2 核 CPU、4 GB 内存"内运行:
在 common.properties 中开启全局开关:
task.resource.limit.state=true在任务定义中配置:
- CPU Quota:
200(200% = 2 个 CPU 核心满载) - Max Memory:
4096(4096 MB = 4 GB)
- CPU Quota:
保存并发布工作流。
执行后,Worker 会以sudo systemd-run --scope -p CPUQuota=200% -p MemoryLimit=4096M的方式启动任务进程,任务的计算资源被严格限制在配额之内,避免个别任务打满整台 Worker 机器、影响同机器上的其他任务。
四、参数在任务定义与执行链路中的流转
将上述参数串起来看,一个任务节点从"配置"到"执行"的完整链路如下:
- 配置阶段:用户在 UI 上配置上述默认参数,参数随任务定义(
TaskDefinition)持久化到t_ds_task_definition表;每次修改都会产生一条新的TaskDefinitionLog版本记录; - 派发阶段:工作流调度器依据 DAG 依赖(Predecessor Task)、运行标志(Run Flag)与延迟时间(Delayed Execution Time),将就绪的任务实例按优先级(Task Priority)提交到指定 Worker 分组(Worker Group)的队列中;
- 执行阶段:Worker 按优先级与先来先服务原则取出任务,加载任务环境(Environment Name)与资源文件(Resources),在开启资源限制时通过 systemd scope 施加 CPU/Memory 配额后启动任务进程;
- 失败处理:任务失败时按重试次数与间隔(Number of Failed Retries / Failure Retry Interval)自动重试;超时时按超时策略(Timeout Alarm)发送告警或终止任务;因内存超限被 OOM Kill 的任务不参与自动重试。
从源码看,TaskDefinition的equals()方法(TaskDefinition.java)对name、description、taskType、taskParams、flag、taskPriority、workerGroup、failRetryTimes、failRetryInterval、timeoutFlag、timeoutNotifyStrategy、environmentCode、taskGroupId、cpuQuota、memoryMax等字段逐一比较,意味着以上任何默认参数的变更都会使任务定义产生新版本,这一机制保证了每次配置调整都可追溯、可回滚。
五、配置建议与注意事项
- 同一工作流内节点名称必须唯一,否则会破坏 DAG 定义的完整性;
- 临时不需要执行的任务优先使用"禁止执行"开关,而非删除节点,便于后续恢复;
- 资源敏感的共享 Worker 集群务必开启
task.resource.limit.state并为任务设置合理的 CPU Quota 与 Max Memory,防止单任务拖垮整个 Worker; - 内存上限的配置要留有余量:超过 Max Memory 的任务会被 OOM 杀死且不自动重试,可能造成工作流整体失败,因此阈值应高于任务实际内存峰值的合理冗余;
- 资源限制依赖 systemd 与 sudo:该特性基于 Linux
systemd-run实现,要求 Worker 操作系统支持 systemd 且运行 DolphinScheduler 的用户具备相应 sudo 权限,非 Linux 或受限容器环境可能无法生效; - 任务组(Task Group)不配置则不生效,如果需要限制某类任务的整体并发量,应创建任务组并将任务关联到组内;
- Worker 分组
default为随机派发:若任务对机器资源有特殊要求(如大内存机器),应创建独立 Worker 分组而非使用默认组。
六、延伸阅读
- 任务参数附录原文:docs/docs/en/guide/task/appendix.md
- 架构级配置说明(含
task.resource.limit.state的完整上下文):架构配置文档 - 任务定义实体与字段映射:TaskDefinition.java
- 全局配置默认值:common.properties
- Worker 端资源限制实现:BaseLinuxShellInterceptorBuilder.java
- 任务执行上下文(资源参数流转载体):TaskExecutionContext.java
【免费下载链接】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),仅供参考