工作流(Workflow)是基于任务依赖关系实现流程自动化的管理工具。周期工作流专注于定时循环的数据加工场景(如每日、每月),通过预设周期自动生成任务实例。它遵循“定时触发+上游就绪”双重逻辑,确保复杂数据链路能够稳定、有序地完成闭环运行。周期工作流典型使用场景包括:
按固定时间周期自动执行数据处理任务:如每日、每小时、每周等频率的数据同步、清洗或聚合等任务。
构建复杂的DAG依赖流程:通过可视化拖拽方式整合多种类型节点(如MaxCompute SQL、Hologres、EMR、Python等),并建立任务间的上下游依赖关系,实现自动化调度。
统一调度管理多个子任务:将一组具有逻辑关联的任务封装在同一个工作流中,以工作流整体参与调度,便于维护和监控。
快速入门
本功能适用于 DataWorks 新版数据开发(Data Studio)。 如何区分新旧版,请参见常见问题与答疑。
这是一个最基础、可直接执行的周期工作流示例。我们将构建一个虚拟节点(控制起点) → SQL 节点(数据加工)的简单链路,并进行周期调度的例子。场景假设,每天凌晨自动计算前一天的订单总数,并写入结果表。
一、准备计算资源与数据
在目标工作空间中绑定MaxCompute为计算资源。
在MaxCompute中,创建一张如下结构的表,用以存放结果。
-- 创建一个简单的结果表 CREATE TABLE IF NOT EXISTS dw_order_count_test ( order_date STRING, total_count BIGINT ) PARTITIONED BY (ds STRING); -- 以 ds 为分区,存放每天的统计结果
二、新建周期工作流
进入DataWorks工作空间列表页,在顶部切换至目标地域,找到已创建的工作空间,单击操作列的,进入Data Studio。
若按钮显示为数据开发,进入的是旧版数据开发,请勿选择。
单击左侧导航栏
,在项目目录右侧单击,进入新建工作流页面。在新建工作流对话框,选择调度类型为周期调度,输入相关信息(例如,名称为
minimal_daily_demo)并完成创建。
三、编排工作流:拖拽节点与连线依赖
在打开的工作流画布中,从左侧组件面板拖入一个虚拟节点,命名为
start_node。虚拟节点仅用于定义业务起点,不会真正执行。
拖入一个 MaxCompute SQL 节点,命名为
count_orders。鼠标点击
start_node底部的圆点,拉线连接到count_orders的顶部,构建简单的加工链路。
四、开发节点代码
推荐启用DataWorks Copilot 代码编程助手,以获得智能代码补全建议,提升开发效率。
双击打开
count_orders节点,进入节点代码编辑器。编写节点的业务逻辑代码(此处使用模拟统计数据)。
-- bizdate 是定义的调度变量,需在调度配置中指定含义 INSERT OVERWRITE TABLE dw_order_count_test PARTITION (ds='${bizdate}') SELECT '${bizdate}' as order_date, COUNT(*) as total_count FROM (SELECT 1 as id UNION ALL SELECT 2 as id) t; -- 模拟数据具体节点开发,请参见MaxCompute SQL节点。
点击节点编辑器顶部的保存按钮,完成保存。
五、配置调度周期&参数
回到工作流,在工作流画布的右侧,点击调度配置 > 调度时间标签页:
设置调度周期为日;
设置调度时间为
00:05(即每天凌晨 0 点 5 分运行)。
在
count_orders节点的编辑器右侧,设置 ,添加参数名为bizdate且对应参数值为$[yyyymmdd-1](这表示“当前日期减一天”,即昨天)。
六、单节点调试 + 工作流整体调试
count_orders节点调试:配置调试参数:单击节点编辑页右侧的运行配置。
在计算资源中选择步骤一准备的MaxCompute计算资源。
在脚本参数中,填写本次运行值,默认为当前日期的前一天。
调试运行任务:单击工具栏中的运行按钮,此时将使用您在运行配置中的调试参数运行节点。
当运行效果符合预期之后,点击右上角的同步至调度,将运行配置同步至调度配置。
工作流整体调试:
返回工作流画布,单击顶部工具栏的
图标。在弹出的对话框中,填写工作流的本次运行值(例如今天20260120,
bizdate应该被替换为20260119)。
七、发布到生产
返回工作流,单击顶部工具栏的
按钮。在发布面板中,系统会进行依赖和配置检查。确认无误后,单击开始发布生产,选择发布方式为全量发布。
发布成功后,前往运维中心,查看周期任务列表是否存在该工作流。
此时您已完成一个最简单的周期调度工作流开发,该工作流将在每日凌晨运行。
核心设计与配置
工作流编排的核心逻辑是通过可视化DAG画布,利用控制类节点(如归并/分支节点等)和联动类节点(如HTTP触发器)组织任务结构,结合调度参数传递上下文,并通过调度依赖定义任务间的执行顺序与触发条件,以实现复杂数据处理流程的自动化与有序调度。
节点/工作流编排
简单流程编排
数据开发通常涵盖从多源集成到分层建模(如 ODS、DWD 层构建)的复杂链路。DataWorks 通过可视化编排能力,将繁杂的逻辑拆解为功能各异的子节点,构建起标准化的处理流程。这种基于有向无环图(DAG)的编排模式,实现了状态驱动的自动化流转:上游节点运行成功后即时触发下游任务,确保全链路加工过程线性稳定、有序闭环。此时的流程编排是最简单的,是静态、线性且不可回头的DAG(有向无环图)。
复杂编排:流程控制
分支/归并节点、for-each/do-while节点仅支持DataWorks标准版及以上版本。
流程控制类节点是实现数据开发从任务集成向业务编排跨越的核心组件。它突破传统有向无环图(DAG)仅能表达单一线性依赖的局限,通过一系列精密的逻辑控制节点,赋予数据工作流的逻辑表达能力。
节点名称 | 节点描述 |
虚拟节点 | 作为空跑节点,不执行实际计算,用于统筹管理多个子任务,作为工作流的起始节点。例如,在商品订单分析工作流中,使用名为 说明 若单节点开发,则需要使用工作空间根节点作为起始依赖节点。 |
分支节点 | 根据上游结果判断走不同分支逻辑。例如,检查每日订单总额。若总额为 0,则触发告警节点并停止后续计算;若总额大于 0,则继续执行报表生成节点。 |
归并节点 | 对多个分支的执行结果进行归并,解决下游依赖挂载问题。例如,财务结算任务依赖“正常结算”和“补账逻辑”两个分支,归并节点确保无论走哪个分支,只要逻辑闭环后即触发最后的报表归档。 |
遍历节点 (for-each) | 遍历赋值节点传递的结果集,对每个元素执行下游操作。例如,针对赋值节点获取的 31 个省份名称,循环执行 31 次数据清洗任务,每次处理一个省份的数据分区。 |
循环节点 (do-while) | 循环控制,直到满足条件之后继续下一步。例如,每隔 10 分钟调用一次外部接口查询数据同步状态。若返回值为“处理中”,则继续循环;若返回“完成”,则退出循环启动后续加工。 |
更多详情,请参见新版数据开发通用节点。
复杂编排:状态感知与外部联动
Check节点仅支持DataWorks专业版及以上版本;其他节点仅支持DataWorks企业版。
该类节点实现状态感知与条件判定的核心组件。它不仅负责精准判定工作流所依赖的物理资源或前置任务是否准备就绪,还通过与第三方系统的交互联动,打破了数据平台与业务系统间的通信壁垒。
节点名称 | 节点描述 |
HTTP触发器 | 接收外部系统HTTP请求,触发DataWorks任务运行。例如,上游业务系统完成日结后,调用HTTP接口触发DataWorks的T+1数据加工流程。 |
Check节点 | 监控外部资源(如OSS文件、MaxCompute分区)是否就绪,就绪后触发下游任务。例如,等待OSS中当日日志文件上传完成,Check节点检测到文件存在后,启动日志解析任务。 |
依赖检查节点 | 通过主动轮询、逻辑组合与跨周期/跨空间依赖是否就绪,就绪后触发下游任务 ,实现对复杂调度触发条件的精准控制。例如,日周期调度节点等待前一日全部24个小时任务完成。 |
更多详情,请参见新版数据开发通用节点。
封装子工作流实现逻辑复用
周期工作流支持通过SUB_PROCESS节点将一段稳定通用的子任务链路封装成一个可复用的模块(子工作流),供其他工作流引用。例如,电商、广告和IoT业务线可共用一个标准化处理流程,包括数据清洗、汇总统计、数据质量等。该流程可封装为可被引用的子工作流,提升开发效率。
操作路径:
在计划被引用的工作流
child_workflow,将工作流属性设置为可被引用,此时该工作流变成子工作流。在主工作流中,拖入SUB_PROCESS节点,选择引用的工作流为
child_workflow。
子工作流具有以下约束:
内部性:该工作流及其所有内部节点,不能配置任何对外部任务的依赖。
隔离性:该工作流不能被任何外部任务直接设置为依赖。
被动触发:发布后不会自动生成调度实例。它仅在被其他工作流的
SUB_PROCESS节点调用时才会执行。更多详情,请参见SUB_PROCESS节点。
工作流拆分与模块化建议
为保持工作流的可维护性和性能,建议将节点数超过 100 的大型工作流进行拆分:
按业务域拆分:将不同业务主题(如交易、用户、商品)的加工链路拆分为独立的工作流。
利用 SUB_PROCESS 封装通用逻辑:将公共的、可复用的处理步骤(如数据清洗、格式化)封装成“可被引用工作流”。
调度依赖设置
调度依赖是保障数据加工顺序性、一致性与准确性的核心机制。它通过定时时间满足与上游成功触发的双重逻辑,将孤立的任务连接成有序的数据生产线。当编排工作流内的节点时,节点之间默认建立调度依赖。除了工作流内节点上下游的依赖之外,还可通过调度依赖设置更多复杂的依赖。
更多详情,请参见调度依赖。
工作流级依赖当整个工作流需要作为一个整体,等待其他任务(另一个工作流或独立节点)完成后才能启动时,使用工作流级依赖。这适合将工作流视为一个独立的业务模块,例如销售业务工作流整体等待基础数据工作流产出后再启动。 | 节点级依赖当工作流中的某个特定节点需要等待一个不在此工作流内的外部任务完成时,使用节点级依赖。这允许更精细化的跨流程编排。例如报表工作流中的某一个汇总节点,需要等待外部财务系统的特定节点产出。推荐在上游配置依赖检查节点,保证依赖任务及时完成。 |
跨周期依赖任务自依赖是指一个任务的当前周期实例依赖其不同周期的实例,支持同节点自依赖或不同节点依赖。例如,使用 INSERT OVERWRITE 操作覆盖写入分区表的任务,或涉及存量累计计算的场景。开启自依赖后,当天实例必须等前一天的实例成功后才能运行。 | 跨工作空间依赖当需要依赖其他 DataWorks 工作空间的任务时,可通过工作空间名和节点的输出名/名称/ID唯一关联节点。适用于跨部门、跨项目的数据协作,例如营销工作空间中的任务需要引用账务工作空间的关键数据。 |
参数设计与流转
工作空间参数仅支持 DataWorks 专业版及以上版本。
DataWorks 新版数据开发支持四种层级的参数传递机制,并可通过节点上下文参数实现灵活的跨节点动态数据传递。按作用域从低到高依次为:
节点参数在批处理任务中,当同一套 SQL 代码需要每天处理不同的分区数据,可使用节点参数在代码中动态定义日期。支持常量、内置变量以及自定义时间表达式等。 更多详情,请参见调度参数来源及其表达式。 | 上下文参数通过上游节点的输出参数传递给下游节点,实现动态值传递。支持常量、变量以及上游运行结果。 更多详情,请参见配置并使用节点上下文参数。 |
工作流参数一个工作流内可能有几十个节点,它们需要共用一些特定的业务标识,手动逐个修改节点参数极易出错。工作流参数即可用来区分,并在工作流内所有节点生效。 更多详情,请参见工作流参数。 说明 工作流中的子工作流支持直接引用工作流的参数。 | 工作空间参数代码在“开发环境”调试和“生产环境”运行时,连接的数据库名称、使用的资源路径通常是不同的。此时,可通过在工作空间级别定义区分,适用于整个工作空间的所有节点。例如,定义工作参数 更多详情,请参见使用工作空间参数。 |
调度周期设置
周期工作流和旧版的业务流程核心区别在于,工作流作为一个整体去设置调度周期,而业务流程仅是物理上的集合,不可整体设置调度周期。
调度周期仅支持在工作流级别设置。工作流内部节点只能设置延迟执行时间,该时间是基于工作流定义的定时时间进行累加计算。
维度 | 工作流级配置 | 内部节点级表现 |
时间属性 | 绝对时间(如 02:00) | 相对时间(基于工作流调度时间的延迟) |
周期属性 | 定义日/小时/分钟/周/月/年周期 | 继承工作流周期,不可修改 |
触发逻辑 | 物理时间到达 + 上游成功 | 物理时间 + 延迟时间 + 上游成功 |
调试与运行
完成节点和工作流开发之后,需要进行单节点调试以及工作流整体调试运行,以验证是否满足预期效果。
单节点调试
单节点调试侧重于验证单个节点内部的代码逻辑,例如快速验证一段 SQL 语句、Python 脚本或数据集成同步任务的正确性。该模式仅运行当前节点,不触发上下游依赖关系。
在节点右侧运行配置中配置如下参数:
参数名称
描述
计算资源
选择绑定的计算资源。若无可用计算资源,可在下拉框中选择新建计算资源。
重要需确保计算资源和资源组网络连通,更多信息请参见网络连通方案。
资源组
选择绑定计算资源时已通过测试连通性的资源组。部分节点支持在资源组上配置自定义镜像,以扩展运行环境。
(可选)数据集
部分节点(例如,Shell、Python等)支持使用数据集,以访问存储在OSS或NAS中的非结构化数据。
(可选)脚本参数
在配置节点内容时,通过
${参数名}的方式定义变量,需要在脚本参数处配置参数名、参数值信息,任务运行时会将它动态替换为真实的取值。详情请参见调度参数来源及其表达式。(可选)关联角色
部分节点(例如,Shell、Python等)支持配置关联角色,以访问其他云产品资源。
在节点上方工具栏,单击保存并运行节点任务。
在节点下方查看运行日志,并查看运行结果。
工作流调试
工作流调试侧重于验证整个业务链路中多个节点间的数据依赖、参数传递及执行顺序是否正确。当完成单节点调试后,可进行部分链路调试或整体工作流调试。
在工作流的 DAG 画布页面,点击页面顶部工具栏的运行按钮。也可选中节点,右击选择运行到该节点或从该节点运行,实现局部验证。
在弹出的对话框中,为工作流内所有节点变量(如
${bizdate})统一赋予本次调试的临时值。系统将严格按照 DAG 图定义的依赖关系,从上到下依次执行。在画布上实时观察节点状态,并可单击任意节点查看运行日志。
此时,可点击画布左侧返回按钮,返回至工作流开发状态。
右侧运行历史展示工作流的所有调试运行记录。
所有涉及流程控制(循环、分支、归并)的通用节点,均需置于工作流中,并配合上下游节点才能有效调试和执行。
管理与运维
克隆工作流
克隆工作流可快速完整地复制一个现有的工作流,包括其内部所有节点、代码和依赖关系,生成一个全新的、独立的工作流。操作入口在项目目录,右键单击目标工作流,选择克隆。
克隆操作极易引入潜在风险,因为它复制了几乎所有配置。在提交和发布克隆后的工作流之前,务必逐一检查以下配置,这被称为“环境隔离”检查:
产出表与目标数据源:克隆的工作流代码会和原工作流写入完全相同的目标表。必须修改代码中的目标表名(例如,从
ods_user_table改为dev_ods_user_table),或修改节点输出配置,以防止多个任务操作同一个表,引起数据冲突。上游依赖:检查工作流的上游依赖配置。克隆后的工作流默认仍会依赖原始的上游任务。确认这是否符合你的预期,否则可能导致数据链路混乱或任务空跑。
参数配置:检查工作流及内部节点的自定义参数,特别是涉及日期分区(如
${bizdate})、输入/输出路径等参数,确保它们在新环境下是正确的。
除了克隆工作流之外,同时支持工作流内的节点克隆,但不支持跨工作流的节点复制。
版本管理
内部节点单独发布,在工作流中也会生成一个新的版本。
版本管理自动记录工作流的每一次变更,支持查看、对比历史版本,并在必要时快速回滚到任意一个历史状态,是保障任务稳定性和支持团队协作的关键功能。
在工作流画布右侧,可以找到版本面板。在版本面板中,你会看到两种记录,理解它们的区别至关重要:
开发记录:每次在画布上点击保存时生成。它只是一个开发过程中的快照,用于防止代码意外丢失。它不会影响线上正在运行的任务。
发布记录:当工作流被成功发布到生产环境后生成。这才是线上调度系统实际执行的版本。线上任务出现问题时,我们主要关注发布记录进行回滚。
典型应用场景
故障快速回滚:当线上任务因代码变更而出错时,可通过还原功能,一键将工作流恢复到上一个稳定的发布版本,最大限度缩短故障时间。
变更审计与追溯:需要排查某个逻辑是什么时候、由谁修改的时,可以通过版本列表和对比功能,清晰地追溯每一次代码变更。
代码找回:当不小心删除了部分代码逻辑且未保存时,可以从最近的开发记录中将其还原。
重要注意事项
还原操作会覆盖当前开发区:执行还原操作,会用你所选的历史版本内容,直接覆盖掉当前画布上的所有代码和配置。强烈建议在执行还原前,如果当前画布上有未提交的有效修改,请先将其手动复制到本地文本编辑器中进行备份。
还原后需要重新发布:还原操作仅仅是将代码恢复到了开发态。这个恢复后的版本不会自动同步到线上。你必须手动发布,回滚才能在生产环境中正式生效。
发布与运维
节点/工作流发布:完成工作流开发之后,将节点/工作流发布至生产环境,此时开发环境的节点将生成生产环境对应的周期任务。详情请参见节点/工作流发布。
节点/工作流运维:生产环境的工作流,将根据调度配置进行周期性调度。前往运维中心查看周期工作流的调度情况并执行相关运维操作。详情请参见:周期任务基本运维操作、补数据实例运维。
任务运行机制
在调度场景下,工作流整体是否返回成功状态,会受到内部任务运行状态的影响。
工作流的整体成功与否,由其内部节点的最终状态决定,遵循以下规则:
失败:只要有一个关键节点运行失败,整个工作流实例通常会置为失败。
冻结/暂停:工作流内部有节点被手动冻结或暂停,且该节点是后续节点的上游,会导致链路中断,工作流整体也会被置为失败。
归并(Join)节点:如果工作流使用了归并节点,其上游分支中即使有节点失败,只要归并节点自身逻辑判断可以成功,整个工作流也可能返回“成功”。因此,需谨慎设计归并节点的上游检查,防止“带病运行”。
特殊场景说明:
冻结工作流任务的补数据实例时,工作流实例将会被置为成功状态。
补数据场景下判断任务无法执行时,工作流会被置为失败状态。
实例状态和实际失败事件产生时间存在延迟。
配额与限制
节点数量限制:单个工作流最多支持创建 400 个内部节点,但为保证画布加载性能和可维护性,建议将节点数控制在 100 个以内。对于更复杂的场景,建议进行模块化拆分。
子工作流限制:
启用可被引用开关的工作流,其自身及内部节点不能依赖任何外部任务,也不能被任何外部任务直接依赖。否则,发布时会报错。
此类工作流发布到生产环境后,默认不会自动生成调度实例,只有在被其他工作流通过 SUB_PROCESS 节点引用时,才会作为子任务运行。
常见问题(FAQ)
Q:工作流和业务流程区分?
A:工作流是一个整体,业务流程只是一个文件夹分类。
Q:为什么调试能跑、周期调度失败?
A:最常见的原因是环境不一致。请重点排查:
资源组差异:调试时可能使用了个人或调试资源组,而生产调度配置的是生产资源组。请确认生产资源组是否有效、有余量且权限正确。
权限差异:生产环境运行账号可能缺少对某些表、函数或资源的访问权限。
依赖差异:生产环境的依赖关系与开发环境不一致,或上游依赖的产出在生产环境中不存在。
Q:为什么实例一直等待/不运行?
A:实例运行需要依赖调度时间、调度资源、上游依赖节点等条件完全满足。
上游依赖未完成:在运维中心查看实例的“依赖”视图,检查哪个上游任务还未成功。
资源等待:计算资源组队列已满,任务正在排队等待资源。
工作流/节点被冻结:检查工作流或其上游节点是否被手动“冻结”或“暂停”。
实例未生成:确认当前时间是否已到达工作流的定时调度时间点。如果任务刚发布,需要等到下一个调度周期才会生成实例。更多详情,请参见实例生成方式:发布后即时生成。
Q:为什么工作流整体显示失败但部分节点成功?
A:这是由工作流的状态判定规则决定的:
关键路径失败:只要有一个下游依赖未完成的节点失败,整个工作流就会被标记为失败,即使其他并行分支已成功。
节点被冻结:内部有节点被冻结会导致工作流整体失败。