DataWorks 中的调度依赖用于定义周期调度节点(即在调度系统中按周期自动运行的任务节点)之间的上下游关系。配置调度依赖后,系统会确保所有上游节点的实例均运行成功后,下游节点的实例才会被触发执行,从而保障数据按正确的顺序产出和消费。本文介绍调度依赖的基本概念、依赖类型和配置方式,帮助您在配置前建立整体认知,并快速找到适合您场景的操作文档。
功能介绍
调度依赖是 DataWorks 中用于定义节点间上下游关系的机制。通过配置调度依赖,您可以指定一个节点在哪些上游节点运行成功后才开始执行,从而保证数据处理的正确顺序。配置依赖后,DataWorks 调度系统将自动编排执行顺序:仅当所有上游实例运行成功,且时间、资源等条件均满足时,下游实例才会被触发。
DataWorks 通过节点输出名称和节点输入名称匹配来建立节点间的依赖关系。配置依赖的核心操作流程如下:
上游节点配置输出:为上游节点添加输出名称,通常以
项目名.表名的形式命名(例如my_project.dim_user),代表该节点产出的数据表。下游节点配置输入:在下游节点中搜索并选择上游节点的输出名称作为本节点的输入(即依赖),完成依赖关系的建立。
自动解析(可选):对于 SQL 类节点,DataWorks 可以自动解析代码中的
INSERT和SELECT语句,识别输入表和输出表,自动生成依赖配置。您也可以在自动解析的基础上手动调整。支持解析的节点类型参见:各类型节点自动解析场景。
每个节点必须至少有一个输出名称。系统会为节点自动生成一个默认输出(格式为 项目名.节点ID_out),即使删除所有自定义输出,该默认输出也会保留。
规则约束
发布生效原则:调度依赖配置仅在节点提交到运维中心后生效。开发节点时的配置不会自动同步至调度环境。
上下游调度状态:依赖关系生效的前提是上游与下游节点实例均已生成,且为正常调度状态。若节点配置异常或者上游实例异常,可能导致节点孤立,无法正常调度。
环路依赖限制:系统禁止存在循环依赖(A 依赖 B,B 依赖 A)的节点,包括直接和间接循环。提交时若检测到环路,系统将阻断发布并报错。
依赖类型
DataWorks 支持两种调度依赖类型:同周期依赖和跨周期依赖,分别适用于不同的业务场景。
先导概念
周期是一个相对概念,其含义由节点的调度时间定义。一个“调度周期”是指节点两次相邻调度实例间的时间偏移量,由其调度频率决定。比如对于天调度任务,其上一周期为前一天的实例;对于小时调度任务,则为上一小时的实例。
调度频率 | 一个周期 |
天、周、月、年调度 | 1 天 说明 对于周、月、年调度任务,实例仍按天维度生成(非调度日为空跑实例)。因此,依赖计算基于天粒度,上一周期实例可能为空跑状态。 |
小时调度 | 小时级别的间隔 |
分钟调度 | 分钟级别的间隔(如每5分钟) |
两种依赖类型
举例:一个天调度节点 A 产出表 dim_user,下游节点 B 消费该表:
同周期依赖:B 的今天的实例等待A 今天的实例运行成功后再运行。即 B 消费的是 A 当天产出的数据。
跨周期依赖:B 的今天的实例等待A 昨天的实例运行成功后再运行。即 B 消费的是 A 前一天产出的数据。
对比项 | 同周期依赖 | 跨周期依赖(依赖上一周期) |
含义 | 本节点当前周期的实例运行,依赖上游节点当前周期实例的运行结果。 | 本节点当前周期的实例运行,依赖指定节点上一周期实例的运行结果。指定节点可以是本节点自身(自依赖)、下游一级子节点或任意其他节点。 |
DAG 图中的表现 | 以实线展示。 | 以虚线展示。 |
典型场景 | 节点 B 需要读取节点 A 今天产出的数据。 | 节点依赖昨天产出的数据(如 T-1 取数);小时/分钟任务通过自依赖实现串行执行,避免多个周期并发。 |
配置方式 | 支持自动解析、业务流程拉线、手动添加。 | 在调度配置面板的"上一周期"区域,选择依赖形式并指定节点ID。 |
说明:同一对节点之间,同周期依赖和跨周期依赖可以同时存在,但需要明确各自的业务含义。如果您仅需要跨周期依赖,请记得删除系统自动解析产生的同周期依赖,否则下游实例仍需等待上游当前周期实例完成后才能运行,导致不符合预期的延迟。
调度依赖配置指引
为确保调度链路的完整性与可维护性,所有节点均需配置上游依赖后方可发布至运维中心进行自动调度(若无数据依赖,需依赖虚拟节点或根节点)。配置调度依赖时,需梳理节点的业务逻辑,明确依赖对象和依赖类型,选择最合适的配置方式,构建出既稳健可靠又结构清晰的数据工作流。
1. 明确依赖对象
在配置依赖之前,需完成以下准备工作:
梳理血缘关系:确认上游产出的表/分区与下游读取的表/分区是否匹配。
检查调度属性:确保节点的调度周期、生效时间、调度参数等已正确设置,因为调度属性直接影响依赖的挂载行为。
根据当前节点对数据的依赖形式,选择依赖对象。
场景一:依赖于上游节点的直接产出 |
|
场景二:依赖非调度上游数据(数据就绪驱动) |
|
场景三:无直接数据依赖,但有业务逻辑关联 |
|
2. 选择依赖类型
若当前节点依赖上游节点的直接产出(即场景一),需要进一步确认,依赖的数据为上游同周期的产出,还是跨周期的产出。
核心判断
看下游实际读取的是上游哪个周期产出的数据。节点周期写入某张表某个分区的数据,大部分场景都是采用调度参数来动态实现,您可参考调度参数支持的格式,了解调度参数的替换原理。若您需要依赖同工作空间某节点,则可检查其调度参数的配置情况。
确认方式
同空间节点:查看上游节点代码中的调度参数。参数替换后写入的是“今天”的分区还是“昨天”的分区。
开发环境看上游节点的调度参数配置和节点代码详情,生产环境看实例详情中的参数替换结果。
跨空间节点:通过数据地图查看上游表的分区信息和变更记录。
确认每天实际写入的分区值。
选择类型
下游代码取的是上游当天/当前周期的分区:同周期。
下游代码取的是上游前一天/上一周期的分区:跨周期。
小时/分钟任务需要串行不并发 :跨周期,即依赖本节点。
未正确确认血缘的后果:
依赖缺失风险:若存在表血缘但未配置调度依赖,下游任务将在上游实例成功前启动,导致读取不到数据或数据不完整。
参数匹配风险:若依赖配置但分区参数错位(如上游产出今日分区,下游读取昨日分区),将导致数据逻辑错误与质量异常。
3. 配置依赖关系
根据步骤1、2确认的依赖对象和依赖形式,选择合适的配置方法进行依赖配置。
DataWorks支持不同调度频率的任务互相依赖挂载,结合同周期/跨周期依赖和调度参数,可实现丰富的调度场景。详见:
4.调度依赖关系确认
配置完成后、发布之前,必须进行验证:
确认方式 | 说明 |
用于提前预览节点当前配置的调度依赖是否符合预期。
| |
用于提交节点时,确认当前版本节点依赖变更是否符合预期,及变更对生产的影响。 开启自动解析时,为保障生产数据正常产出,您需要在提交节点时,对节点调度变更的相关操作进行二次确认。可使用该功能保障依赖变更不影响生产任务数据产出。 | |
用于节点发布后,在运维中心确认生产调度任务的依赖是否符合预期。
|
移除依赖影响
在任务运维或迭代过程中,可能需要移除或调整已有的调度依赖。
移除依赖前,请务必评估对下游任务调度行为的影响,避免造成任务孤立或数据事故。
下游依赖场景 | 移除依赖后的影响 | 风险等级 |
下游仅依赖当前节点 | 下游任务变为孤立节点,失去上游触发机制,不再自动调度运行。 | 高 |
下游依赖多个父节点 | 下游任务可能在上游数据未就绪时启动,导致数据缺失或计算错误。 | 中 |
下游依赖跨周期实例 | 若移除跨周期依赖,下游可能读取到错误业务日期的数据,导致数据逻辑混乱。 | 中 |
应用场景
离线数仓分层建设:ODS → DWD → DWS → ADS 全链路依赖配置,确保分层数据按序产出。
标准 ETL 链路:配置同周期依赖,确保下游任务严格等待上游实例成功后执行,保障数据加工链路的顺序性与一致性。
隔日(T+1)报表:配置跨周期依赖(偏移量 -1),使今日任务依赖昨日完整业务数据,实现隔日数据准确分析与产出。
多周期混合聚合:配置跨周期依赖,使天粒度任务依赖小时粒度任务的全周期实例,确保汇总前底层数据完整就绪。
外部数据就绪触发:配置自定义依赖或检查节点,确认外部文件送达或接口就绪后触发流程,实现跨系统调度协同。
复杂工作流控制:利用虚节点聚合多分支依赖,作为流程控制里程碑,简化链路结构并提升监控可视性。
常见问题
以下为典型场景说明,更多调度依赖的常见问题,请参见依赖关系常见问题。
节点唯一性相关。
开发环境与生产环境节点形态不同但节点唯一:同一节点在开发环境和生产环境中的调度依赖配置可以不同,即同一个节点在开发环境和生产环境可以拥有两种不同的形态,但节点唯一。
下线节点前需在开发环境与生产环境同时移除下游依赖:由于节点唯一性,为保障下游任务取数及运行无误,DataWorks在下线上游任务前,需先在下游节点调度移除,然后重新配置下游节点需要依赖的上游节点,并提交发布。确保开发环境及生产环境该依赖都被移除后,才可下线上游任务。
与实例生成方式相关。
新建节点时,请确保上下游节点的实例生成方式相同,避免因为实例生成方式不同,上游节点当天生成实例,下游节点隔天生成实例,导致下游实例变为场景:节点孤立。
变更已存在节点的调度周期,并且选择发布后及时生成实例时,修改节点的调度依赖时,已生成的实例不会自动删除,节点发布后当天周期实例的依赖情况会存在错乱,详情请参见实时转实例对当天周期实例依赖关系的影响。
使用OpenAPI更新作业时出现超出200个上游依赖的报错。
报错详情:'One file could not have more than 200 inputs 'One file could not have more than 200 inputs'。
可通过在上下游之间通过数据开发加上虚拟节点,减少当前节点的直接上游依赖,虚拟节点配置详情请参见:虚拟节点