若任务需要周期性调度运行,用户需定义该任务的调度相关属性,包括调度周期、调度依赖、调度参数等。
注意事项
- 已开启工作空间调度开关。仅当 DataWorks 工作空间开启启用调度周期开关后,工作空间中的任务才可以根据其配置自动调度运行。
- 任务的调度配置仅用于定义任务调度运行时的相关属性,任务需通过发布流程发布至生产环境后,才会根据该配置进行最终调度。
- 调度时间仅定义任务预期执行时间,其实际执行时间还受上游依赖执行情况控制。
- DataWorks 支持多种类型任务互相依赖。
- DataWorks 上,调度任务会根据调度类型及周期数生成相应的实例(例如,小时调度任务每天会根据周期数产生相应数量的小时实例),并通过周期实例的方式自动调度运行该任务。
- 在使用调度参数的情况下,DataWorks 调度任务各周期代码入参由该周期对应的定时时间以及您调度参数表达式最终决定。
功能说明
- 调度依赖
配置项 | 说明 |
调度依赖 |
用于定义该任务的上下游依赖关系。通过依赖关系有序调度运行上下游节点,即当上游节点运行成功后,下游节点才会启动运行,保障适时的产出有效业务数据。您可使用自动解析快速设置节点依赖,也可手动设置节点的依赖关系。
说明: |
- 节点上下文
配置项 | 说明 |
节点上下文(可选) | 用于定义上下游任务间的参数传递,定义后,可在下游节点中使用该参数获取上游节点传递过来的值。 |
配置调度依赖
DataWorks 的调度依赖是指周期调度节点间的上下游依赖关系。通过节点的依赖关系有序调度运行上下游节点,即当上游节点运行成功后,下游节点才会启动运行,保障适时的产出有效业务数据。本文为您介绍调度依赖的配置指引,避免因调度依赖配置有误导致数据异常,配置前建议先了解此内容。
调度依赖配置指引
背景信息
DataWorks 上任务的调度依赖是指调度场景下节点间的上下游依赖关系。在 DataWorks 中,上游节点任务运行完成且运行成功,下游节点任务才会开始运行。配置调度依赖后,可保障调度任务在运行时能获取到正确的数据(即当前节点依赖的上游节点成功运行后,DataWorks 通过节点的运行状态识别到上游表的最新数据已产生,下游节点再去取数),避免下游节点取数据时,上游表数据还未正常产出,导致下游节点取数出现问题。
注意事项
- 节点依赖关系配置后,默认在任务调度运行时,下游节点运行条件之一为其依赖的上游节点均已执行成功,否则当前任务取数会存在质量问题。
- 任务实际运行时间除了取决于任务本身的定时时间(即任务在调度场景下的预期执行时间)外,还取决于上游任务的完成时间(即下游任务实际执行时间还取决于上游任务的定时时间)。若上游任务未完成运行,即便下游任务的定时时间早于上游任务,下游任务也不会运行。
DataWorks 任务依赖最终是为了保障下游取数无误,实际是上下游表数据的血缘依赖。您可根据业务需求,选择是否需要基于表的血缘关系配置调度依赖。节点的调度依赖配置流程如下。
方式一:自定义依赖关系
若 DataWorks 上任务间不存在强血缘依赖(例如,不强依赖上游某个分区数据,仅取上游当前时间点最大分区数据),或依赖的数据非周期调度节点产出的表数据(例如,本地上传的表数据),则您可自定义节点的依赖关系。自定义依赖配置具体如下:
- 依赖工作空间根节点
例如,同步任务中的上游数据来源于其他业务数据库,SQL 类型任务对实时同步任务产出的表数据进行加工等场景,您可直接选择挂载依赖至工作空间根节点下。
- 依赖虚拟节点
当工作空间中业务流程较多或较复杂时,您可通过虚拟节点管理该业务流程,将需要统一管控的节点挂载依赖至某虚拟节点,使工作空间下数据流转路径更加清晰。例如,控制业务流程整体调度时间、控制业务流程整体调度与冻结(即不调度)。
方式二:基于血缘配置依赖关系
由于节点依赖关系配置后,默认节点的上下游产出表存在强依赖关系(即下游表数据的产出需要依赖上游产出的表数据),因此,任务在配置调度依赖时,需确认是否存在强血缘依赖,即确认当前任务是否会因为上游数据未产出而导致当前任务取数出现问题。若下游节点中表数据的产出,需依赖上游节点产出的表数据,则认为上下游节点的表存在强血缘依赖关系。
序号 | 目标 | 描述 |
①② | 确认上下游表是否存在强血缘关系。 | 为避免当前任务执行时间不符合预期,您可先评估表之间是否存在强依赖血缘关系,确认是否需要基于血缘关系配置调度依赖。 |
③ | 确认当前场景是否为周期调度任务产出的表数据。 | 不在 DataWorks 周期调度产出的表数据,DataWorks 无法通过任务运行情况监控数据产出,因此,部分表不支持配置调度依赖。 |
④⑤⑥ | 基于血缘确认调度依赖的配置方式并配置调度依赖。 | 根据需要依赖上游昨天还是今天的数据、小时分钟任务是否要依赖自己上一个小时或分钟实例,来选择依赖上游同周期还是上一周期。 |
⑦⑧⑨ | 预览依赖关系。 | 依赖关系配置完成后,可通过预览依赖、对比代码解析结果,查看周期任务确认配置时,发布前,发布生产后任务依赖关系是否符合预期。 |
基于血缘配置调度依赖
DataWorks 中,表血缘关系体现为产出表数据的节点间的依赖关系。在确认存在强血缘依赖后,您需要判断需要依赖上游昨天还是今天的数据、小时分钟任务是否要依赖自己上一个小时或分钟实例,来选择依赖上游同周期还是上一周期。
调度依赖场景选择与配置
在任务实际调度时,产出数据的代码中会使用调度参数来指定依赖哪个周期实例的数据,具体确认逻辑如下。
说明:调度参数会根据任务调度的业务日期、定时时间及参数的取值格式自动替换为具体的值,实现在任务调度时间内参数的动态替换,进而实现任务查询与产出的表分区变更。
基于表血缘选择调度依赖方式的步骤如下:
- 确认表的血缘关系
为保障任务调度产出的表数据符合预期,您需明确上下游表当天产出的业务数据,确保下游表当天获取的数据为上游表当天的产出数据。
- 基于血缘选择调度依赖的配置方式
明确表血缘后,您可根据血缘关系确定调度依赖的配置方式(即同周期依赖还是依赖上一周期)。
调度依赖配置方式 | 血缘关系 |
配置同周期调度依赖 | 下游依赖上游今天产出的表数据。 |
配置依赖上一周期(跨周期依赖) |
不支持配置依赖的场景
DataWorks 的调度依赖主要用于保障周期调度节点定时更新的表数据,确保下游节点取数无误。因此,不在 DataWorks 上通过调度节点更新的表,DataWorks 无法直接监控。非 DataWorks 周期性调度产出数据的表包括但不限于以下几类:
- 实时同步产出的表
- 从本地上传到 DataWorks 的表
- 维表
- 手动任务产出的表
- 非 DataWorks 上调度节点产出的周期性变更的表
调度依赖关系确认
调度依赖配置后,您可通过以下方式确认依赖关系是否正常。
确认方式 | 说明 |
配置时:预览依赖 | |
提交时:代码解析结果对比 | |
发布后:查看周期任务 | 用于节点发布后,在运维中心确认生产调度任务的依赖是否符合预期。 |
常见问题
以下为典型场景说明,更多调度依赖的常见问题,请参见依赖关系。
配置同周期调度依赖
依赖某节点同周期指本节点本周期运行,依赖上游节点当前周期的数据产出情况(即任务执行情况),待上游当前周期实例执行成功后,本节点才会运行。通常,若当前任务需依赖上游任务同周期产出的表数据时,可为当前任务设置依赖该上游任务的同周期任务。DataWorks 提供多种同周期依赖配置方式,并支持依赖预览功能,您可及时查看并调整有误依赖,保障任务调度符合预期。本文为您介绍同周期依赖的注意事项、配置原理、配置方式等内容。
注意事项
- 同周期依赖在 DataWorks 的 DAG 图中以实线的形式展示
- 部分复杂场景下,当同周期依赖不满足预期时,您可设置跨周期依赖。例如,天任务依赖小时任务的场景下,天任务默认依赖小时任务当天所有实例。您可通过小时任务自依赖,实现天任务依赖小时任务指定周期。
- 为避免生产调度任务由于依赖关系不符合预期导致生产调度延迟,建议在发布任务前,通过预览依赖功能确认各周期实例关系是否符合预期。
配置原则
为提升任务开发效率,建议您在实际开发中使用自动解析功能快速为节点设置依赖关系。基于自动解析进行实际开发时,请遵循以下原则:
- 节点创建:建议节点名称与节点产出表名称一致。
- 代码开发:避免多个节点写入数据至同一张表。
- 依赖配置:建议将节点产出表配置为节点的输出。
配置入口及配置说明
- 依赖的上游节点
- 本节点输出
配置原理
调度依赖配置是将上游节点的输出作为下游节点的输入,形成节点依赖,建议您根据节点查询及写入的表血缘设置节点的调度依赖关系。配置完成后,上游节点运行完成且运行成功,下游节点才会启动运行,保障调度任务在运行时能取到正确的数据。
配置方式
- 通过业务流程面板拉线设置节点依赖
在业务流程面板使用拉线方式设置依赖关系时,DataWorks 将自动为下游节点添加上游节点 _out 格式的输出,形成节点依赖。
- 通过调度配置界面手动添加上游节点依赖
在调度配置界面,通过输入某节点的节点输出,手动添加依赖的上游节点,格式为 projectname.tablename。
- 通过自动解析功能基于表血缘设置节点依赖
后续:确认依赖是否符合预期
配置完成后,为保障任务调度符合预期,您可通过以下操作验证配置是否正确:
- 预览依赖:避免依赖关系不符合预期导致任务调度延迟。
- 提交检查:提交节点时确认依赖变更是否符合预期。
- 周期任务依赖确认:节点发布后,需在运维中心确认生产调度任务的依赖是否符合预期。周期任务为生产环境该任务的最新状态,同时,周期实例的实例依赖关系与实例生成方式有关。
删除或变更节点输出的影响
当节点产出的表数据变更导致节点输出的变更,或直接手动修改节点输出时,请注意以下内容:
配置依赖上一周期(跨周期依赖)
依赖上一周期指本节点本次实例运行,依赖相应节点上一周期实例的运行情况,待上一周期实例运行成功后,本节点才会运行。通常,若本节点需依赖上游昨天产出的数据,或小时、分钟任务依赖自己上一小时或分钟实例,可设置跨周期依赖。本文为您介绍跨周期依赖的配置及依赖形式。
注意事项
配置入口
依赖形式
依赖上一周期:本节点(自依赖)
依赖上一周期:一级子节点
依赖上一周期:其他节点
是否沿用上游的空跑属性
必读:复杂依赖场景调度配置原则与示例
背景信息
挂载依赖:就近原则
依赖关系对任务执行的影响
复杂依赖场景汇总
小时任务依赖其他任务
天任务依赖其他任务
分钟任务依赖其他任务
其他任务依赖周、月、年任务
场景:节点成环
什么是节点成环?
节点成环产生原因与解决方案
成环节点的监控报警
场景:节点孤立
什么是孤立节点?
如何处理孤立节点?
孤立节点监控报警
典型应用场景案例
场景1:包含离线同步节点的业务流程,如何配置调度依赖
场景2:依赖上一周期的结果时,如何配置调度依赖
依赖上一周期是指依赖某个节点的上一周期实例,即跨周期依赖某节点上一周期实例是否正常执行。
DataWorks 支持以下三种跨周期依赖形式:
依赖上一周期和依赖本周期的区别:在运维中心中查看节点依赖关系时,所有跨周期依赖的节点都会以虚线的形式展示。
跨周期依赖的典型场景
场景3:如何配置跨业务流程、跨工作空间的调度依赖
背景信息
跨业务流程配置调度依赖
跨工作空间配置调度依赖
附录
确认表血缘
预览依赖关系
代码解析结果对比
删除或变更节点输出的影响
各类型节点自动解析场景
配置节点上下文
配置输出参数
配置输入参数
下游节点使用输入参数
常见问题
01. 什么是调度依赖
调度依赖就是节点间的上下游依赖关系,在 DataWorks 中,上游任务节点运行完成且运行成功,下游任务节点才会开始运行。
说明:挂载依赖关系后,当前节点执行的必要条件之一为当前节点依赖的父节点需要执行成功。
02. 为什么要设置调度依赖
配置调度依赖后,可保障调度任务在运行时能取到正确的数据(当前节点依赖的上游节点成功运行后,DataWorks 通过节点运行的状态识别到上游表的最新数据已产生,此时,下游节点再去取数)。避免下游节点取数据时,上游表数据还未正常产出,导致下游节点取数出现问题。
03. DataWorks 上如何设置调度依赖?
在 DataWorks 上,上游节点的输出作为下游节点的输入,形成节点依赖关系。
04. 哪些场景不支持设置调度依赖?
由于 DataWorks 的调度依赖主要保障的是调度节点定时更新的表数据,通过节点调度依赖保障下游取数无误。因此,不是 DataWorks 平台上调度更新的表,平台无法监控。
当存在非周期性调度生产数据的表,有节点 select
该类表数据时,需手动删除通过 select
自动生成的依赖上游节点配置。非周期性调度生产数据的表包括:
- 从本地上传到 DataWorks 的表
- 维表
- 非 DataWorks 调度产出的表
- 手动任务产出的表
调度依赖配置常见问题
01. 提交节点报错:当前节点依赖的父节点输出名不存在
02. 提交节点时提示:输入输出和代码血缘分析不匹配
03. 为什么自动解析的父节点名会报依赖的父节点输出(表)不存在?
05. 为什么有些节点的本节点的输出中,下游节点名称、下游节点ID有这些数据,有些为空并且不能手动编辑。
06. 下游任务依赖上游任务的运行规则是什么?
07. 节点的输出名称的作用是什么?
08. 一个节点可以有多个输出名称吗?
09. 多个节点往同一张表写数据,自动解析报错节点输出名相同且提交报错,可以有相同的输出名称吗?
10. 使用自动解析依赖关系时,如何不解析到中间表?
11. 业务流程最上游节点的父节点配置应该如何配置?
节点删除、变更常见问题
01. 为什么在节点A搜索上游节点输出名时,搜索到了节点B不存在的输出名?
因为依赖关系解析是基于已经提交和发布的节点信息来进行搜索,如果节点 B 提交成功后,您又删除了节点 B 的输出名称且未提交至调度系统,则在节点 A 上仍然能搜到节点 B 已删除的输出名。
02. 为什么节点删除报错当前节点存在子节点,下线失败,但是在调度配置界面看已经没有该节点的依赖?
当前节点在开发环境和生产环境都没有节点依赖当前节点时,当前节点才能被下线。您可以分别进入开发环境运维中心和生产环境运维中心进行确认。
跨周期依赖配置实时场景
01. 为什么运维中心有些依赖线是虚线?
虚线是设置了跨周期依赖。
02. 小时任务设置自依赖对自身及下游节点有什么影响?
-
对当前节点执行影响: 上游节点上一周期实例运行成功后下一周期实例才会运行。例如:小时任务 0 点开始每小时调度一次,1 点的实例需要等待 0 点的实例执行成功,1 点的实例才会执行。
-
对下游节点执行影响: 假设下游节点为日调度任务,下游日节点依赖由直接依赖多个小时实例变为直接依赖上游某一个小时实例,小时实例由于存在自依赖,所以下游日任务实际上为间接依赖了上游多个小时实例。
03. 日调度任务依赖小时调度任务运行的不同场景,依赖关系如何配置?
04. 日任务依赖小时任务时,直接设置依赖关系,日任务几点会运行?
原理说明: 当日任务直接依赖小时任务时:日任务会依赖小时任务当天所有实例,即等到小时任务当天最后一个实例执行成功,日任务才会执行。
实时场景:
- 假设小时任务 0 点开始,每小时调度一次。那么日任务需要等待 24 个小时任务全部运行完成才能开始运行天任务。
- 运维中心依赖关系查看:日任务右键查看父节点会显示依赖小时任务当天所有实例,即依赖 24 个小时实例。(依赖线:实线)
05. 天任务依赖小时任务时,如何实现天任务依赖小时任务当天具体某个实例,而非依赖所有的小时实例?
原理说明: 当天任务依赖小时任务当天具体某个小时实例时,小时任务只需要设置自依赖,天任务定时时间与具体某个小时实例定时时间保持一致即可。
实时场景: 当天任务需要依赖小时任务当天定时时间 12 点的实例时。
06. 日任务依赖小时任务时,如何实现日任务依赖小时任务昨天所有的小时实例。而非当天所有小时实例?
-
原理说明: 日任务依赖小时任务昨天所有小时实例,日任务需要跨周期依赖小时任务。
-
实时场景:当天任务需要依赖小时任务当天所有实例。
注:虽然日任务依赖小时任务,且小时任务的定时时间为 21:00,但是日任务是跨周期依赖小时任务昨天所有的小时实例,故日任务 实际执行时间为第二天 1:00。
-
小时任务周期实例运行情况
-
日任务周期实例运行情况
07. 什么情况下配置依赖上一周期的依赖项为本节点?
业务场景: 如果当前节点本周期任务运行需要依赖上一周期当前节点产出的节点数据时,当前节点可以设置自依赖。即当前节点上一周期实例执行完成后,当前节点下一周期的实例才去执行,避免当前实例取数时,上一周期实例还在执行(数据还未产出)。
- 本节点依赖自己上一周期产出的数据,如果您需要确认上一周期产出数据的时间,请在任务的调度配置 > 时间属性区域,配置依赖上一周期 > 本节点。
- 小时任务依赖天任务,当上游天任务运行完成时,已到下游小时任务的多个周期定时时间,导致小时任务多周期并发调度。此时您可以在任务的调度配置 > 时间属性区域,配置依赖上一周期 > 本节点。
08. 下游节点同时依赖多个任务运行时,依赖关系如何配置?
如果下游节点同时配置上了依赖多个任务,是否需要依赖所有节点需要您进行业务判断,如果表数据有强相关依赖的,建议将所有节点都设置上依赖关系。节点是否需要设置依赖关系,请参考为什么要设置调度依赖。
例如,下游节点 C 同时依赖日调度任务 B 及当天的小时调度任务 A,小时调度任务输出结果为表 A,日调度任务输出结果为表 B,下游节点 C 需要依赖表 A 及表 B 运行。
假设下游节点 C 中涉及查询表 A 及表 B 的相关数据,当您仅配置依赖的上游节点为小时调度任务 A,而未配置依赖的上游节点为日调度任务 B,则可能在上游节点的日调度任务 B 未执行完成时,下游节点 C 便开始执行节点任务,导致获取日调度任务的输出表 B 的数据失败,任务运行报错。因此,该示例中,您需要将日调度任务及小时调度任务均配置为下游节点 C 依赖的上游节点。
如果下游节点对上游表没有强依赖关系,即下游节点取任何时候上游表数据都没有问题(即使上游节点最新表数据也未产出),这种情况下,可以不设置节点依赖关系。
09. 上游 A 是小时任务,下游 B 是日任务,任务 B 每天在 A 任务全部执行完成后要汇总执行一次,小时任务运行到第二天,日任务 B 是否会运行,参数是否会影响
日任务 B 直接依赖小时任务 A 当天的实例,日任务 B 会汇总当天的小时任务。如果小时任务完成最后一个实例的运行,已经到了第二天,则下游的日任务仍会执行。只是运行时间不同,调度参数替换不受影响。
- 小时任务 A 调度设置
- 日任务 B 调度设置
注:虽然日任务 B 设置的定时时间为 6:00,但由于小时任务 A 第二天才完成,故日任务 B 实际执行时间为小时任务 A 完成后,立刻执行。
- 小时任务周期实例运行情况
-
日任务周期实例运行情况
-
查看运维中心的调度实例,检查小时任务 A 和日任务 B 是否正常运行,参数是否受影响
10. 节点 A 每天每小时整点执行一次,节点 B 每天运行一次。如何设置节点 A 每天第一次运行成功后,节点 B 便开始执行?
配置节点 A 时,需要勾选依赖上一周期,并选择本节点。节点 B 的定时时间配置为 0 点,则每天自动调度实例中,节点 B 的实例仅依赖节点 A 在 0 点生成的实例,即节点 A 的第一个实例。
调度依赖配置实时场景
01. 有 A、B、C 三个任务,如何实现每个小时执行一次 A->B->C(A 执行完了 B 再执行,B 执行完了 C 再执行)的任务流程?
- 依赖关系设置: 将 A、B、C 的依赖关系设置为 A 的输出为 B 的输入,B 的输出为 C 的输入。
- 调度频率设置: 由于调度配置为节点维度的配置,所以如果 3 个节点都需要小时调度,需要 A、B、C 的调度周期均设置为小时才可。
02. 如何设置跨业务流程,同地域跨项目依赖?
原理说明: 上游节点的输出作为下游节点的输入形成节点依赖关系。在需要设置依赖关系的节点输入处添加需要依赖的节点(跨项目,跨业务流程)的节点输出即可。
03. 已配置失败重跑的任务在运行失败后未重跑,并报错 Task Run Timed Out, Killed by System!!!
- 报错内容:
当目标任务调度配置的时间属性中,重跑属性配置为运行成功或失败后皆可重跑或运行成功后不可重跑,运行失败后可以重跑,实际执行任务时,该任务在运行失败后未重跑,并产生 Task Run Timed Out, Killed by System!!!
报错。
- 可能原因:
该任务调度配置的时间属性中,配置了超时时间。当任务的运行时长超过超时时间,任务自动终止运行。由于超时导致运行失败的任务不会触发任务重跑。
- 解决方案:
当任务运行出现超时失败时,失败重跑机制不生效,您需手动重启相关任务。
参考资料
原创文章,转载请注明出处:http://www.opcoder.cn/article/86/