依赖关系

本文为您介绍依赖关系的相关问题。

什么是调度依赖

调度依赖就是节点间的上下游依赖关系,在DataWorks中,上游任务节点运行完成且运行成功,下游任务节点才会开始运行。

说明

挂载依赖关系后,当前节点执行的必要条件之一为当前节点依赖的父节点需要执行成功。更多调度依赖内容,详情请参见调度依赖配置指引

为什么要设置调度依赖

配置调度依赖后,可保障调度任务在运行时能取到正确的数据(当前节点依赖的上游节点成功运行后,DataWorks通过节点运行的状态识别到上游表的最新数据已产生,此时,下游节点再去取数)。避免下游节点取数据时,上游表数据还未正常产出,导致下游节点取数出现问题。

DataWorks上如何设置调度依赖?

在DataWorks上,上游节点的输出作为下游节点的输入,形成节点依赖关系。

说明
  • SQL任务会以如下方式自动配置节点输入输出:

    • select一张表,将自动解析产出该表的节点作为本节点依赖的上游。

    • insertcreate一张表,将自动解析该表为本节点的输出。

  • 数据集成任务需手动将产出表以projectname.tablename格式作为节点输出,下游对同步产出表进行清洗时,自动解析才能解析到。

  • 因为需通过唯一的输出定位到唯一的节点,以此形成节点依赖关系,所以节点输出(projectname.tablename)需确保唯一。

哪些场景不支持设置调度依赖?

由于DataWorks的调度依赖主要保障的是调度节点定时更新的表数据,通过节点调度依赖保障下游取数无误。因此,不是DataWorks平台上调度更新的表,平台无法监控。

当存在非周期性调度生产数据的表,有节点select该类表数据时,需手动删除通过select自动生成的依赖上游节点配置。非周期性调度生产数据的表包括:

  • 从本地上传到DataWorks的表

  • 维表

  • 非DataWorks调度产出的表

  • 手动任务产出的表

不需要依赖的表如何删除?

右键单击代码中的表名称,选择删除输出,再重新自动解析。删除输入

提交节点报错:当前节点依赖的父节点输出名不存在

提交节点时,系统出现提示,当前节点依赖的父节点输出名不存在。可能出现的原因及解决方案,详情请参见提交节点报错:当前节点依赖的父节点输出名不存在

提交节点时提示:输入输出和代码血缘分析不匹配

提交节点时,系统出现提示,输入输出和代码血缘分析不匹配。可能出现的原因及解决方案,详情请参见提交节点时提示:输入输出和代码血缘分析不匹配

为什么自动解析的父节点名会报依赖的父节点输出(表)不存在?

提交失败

此处报错并不是指表不存在,只是未通过表找到产出表数据的节点挂载节点依赖。

出现上述情况有以下两种原因

  • 上游节点未提交,提交后可以再次尝试。

  • 上游节点已经提交,但上游节点的输出名不是workshop_yanshi.tb_2

说明
  • 如果tb_2为同步任务产出的表,请在产出tb_2表数据的同步任务节点输出那手动以projectname.tablename的方式添加为节点输出,详情请参考文档调度依赖配置指引

  • 如果tb_2为非调度节点每天更新的表,请在代码中找到表右键删除输入,再重新自动解析。

非调度节点每天更新的表,请参见哪些场景不支持设置调度依赖?

为什么有些节点的本节点的输出中,下游节点名称、下游节点ID有这些数据,有些为空并且不能手动编辑。

节点依赖关系是下游节点去挂上游节点依赖。如果当前节点下游无子节点,则无内容。待本节点下游配置子节点后,便会自动解析出内容。

不需要依赖的依赖关系如何删除?

代码中找到表右键删除输入再重新选择自动解析删除输入

下游任务依赖上游任务的运行规则是什么?

在DataWorks调度系统中,节点设置上下游依赖关系是为了保障数据有效产出和获取。所以是否设置依赖关系可以从数据是否存在强相关性去判断。详情请参见调度依赖配置指引

节点的输出名称的作用是什么?

节点的输出名称用于建立节点间的依赖关系。假设节点A的输出名称是ABC,而节点B将ABC作为它的输入,则节点A与节点B之间便建立了上下游关系。

一个节点可以有多个输出名称吗?

可以。节点输出相当于当前节点的定义,下游节点如果需要依赖当前节点,可以通过引用本节点的任何一个输出名称作为下游节点的父节点输出名称,即可与当前节点建立依赖关系。

多个节点往同一张表写数据,自动解析报错节点输出名相同且提交报错,可以有相同的输出名称吗?

不可以。节点输出名和节点、表一样,需要在租户级别唯一。这样自动解析可以根据唯一的输出找到唯一的节点挂上节点依赖关系,所以如果实际场景有多个节点产出数据至同一张表,那么需要确定下游节点自动解析这张表时应该挂哪个节点依赖(哪个节点最晚写入这张表数据,确保下游节点取数无问题即可),并且修改其他节点的输出,确保输出唯一。

若同一个工作空间中,两个调度节点往同一张表插入数据,自动解析场景下将导致其中一个节点产生报错:当前工作空间${projectname}的节点${nodename1}和${projectname}的节点${nodename2}的输出名称相同:${node_outputname},不能多个节点使用同一个输出名

使用自动解析依赖关系时,如何不解析到中间表?

在SQL代码中选中中间表名并右键单击删除输入删除输出,再次执行自动解析输入输出即可。

业务流程最上游节点的父节点配置应该如何配置?

如果是业务流程的业务开始节点,您可以选择在业务流程内添加一个虚拟节点作为业务流程的开始节点。虚拟节点的上游可以设置为工作空间根节点。虚拟节点的使用,详情请参见虚拟节点

为什么在节点A搜索上游节点输出名时,搜索到了节点B不存在的输出名?

因为依赖关系解析是基于已经提交和发布的节点信息来进行搜索,如果节点B提交成功后,您又删除了节点B的输出名称且未提交至调度系统,则在节点A上仍然能搜到节点B已删除的输出名。

为什么节点删除报错当前节点存在子节点,下线失败,但是在调度配置界面看已经没有该节点的依赖?

当前节点在开发环境和生产环境都没有节点依赖当前节点时,当前节点才能被下线。您可以分别进入开发环境运维中心生产环境运维中心进行确认。

为什么运维中心有些依赖线是虚线?

虚线是设置了跨周期依赖,跨周期依赖介绍,详情请参见场景2:依赖上一周期的结果时,如何配置调度依赖

小时任务设置自依赖对自身及下游节点有什么影响?

  • 对当前节点执行影响:上游节点上一周期实例运行成功后下一周期实例才会运行。

    实时场景:假设小时任务0点开始每小时调度一次,1点的实例需要等待0点的实例执行成功,1点的实例才会执行。

  • 对下游节点执行影响:假设下游节点为天调度任务,下游天节点依赖由直接依赖多个小时实例变为直接依赖上游某一个小时实例,小时实例由于存在自依赖,所以下游天任务实际上为间接依赖了上游多个小时实例。

日调度任务依赖小时调度任务运行的不同场景,依赖关系如何配置?

  • 场景一:日调度任务依赖小时调度任务当天的所有小时实例。

    天调度任务直接依赖小时调度任务时,会依赖小时调度任务当天所有实例。天任务直接依赖小时任务

  • 场景二:日调度任务依赖小时调度任务当天具体某个实例。

    • 小时调度任务配置:小时调度任务设置自依赖,即小时任务调度配置界面依赖的上一周期处选择本节点。

    • 日调度任务配置:天调度任务直接依赖小时任务。即天调度任务的输入(依赖的上游节点)配置小时任务。

    小时任务设置自依赖
  • 场景三:日调度任务依赖小时调度任务昨天所有的小时实例。

    • 日调度任务调度配置跨周期依赖小时调度,即日调度任务调度配置界面选择依赖上一周期,选择自定义,填小时任务节点id。

    • 日调度任务调度配置去掉小时任务同周期依赖,即同周期依赖(依赖的上游节点)处,去掉小时任务同周期依赖。

说明

如果日调度任务对小时调度任务做过跨周期依赖,那需要检查是否同周期依赖已经去掉。否则日调度任务会同时依赖小时调度任务当天所有实例和昨天所有实例。

天任务依赖小时任务时,直接设置依赖关系,天任务几点会运行?

原理说明:当天任务直接依赖小时任务时:天任务会依赖小时任务当天所有实例,即等到小时任务当天最后一个实例执行成功,天任务才会执行。

实时场景:

  • 假设小时任务0点开始,每小时调度一次。那么天任务需要等待24个小时任务全部运行完成才能开始运行天任务。

  • 运维中心依赖关系查看:天任务右键查看父节点会显示依赖小时任务当天所有实例,即依赖24个小时实例。(依赖线:实线)

天任务依赖小时任务时,如何实现天任务依赖小时任务当天具体某个实例,而非依赖所有的小时实例?

原理说明:当天任务依赖小时任务当天具体某个小时实例时,小时任务只需要设置自依赖,天任务定时时间与具体某个小时实例定时时间保持一致即可。

实时场景:当天任务需要依赖小时任务当天定时时间12点的实例时

  • 依赖关系设置:

    • 上游小时任务配置:小时任务需要设置自依赖,即在调度配置,在时间属性区域,选中依赖上一周期 > 本节点

    • 下游天任务配置:天任务设置定时时间为12点。

  • 运维中心依赖关系查看:

    • 天实例右键查看父节点会显示依赖小时任务当天定时时间为12:00的实例。(依赖线:实线)

    • 小时实例右键查看父节点会显示上游父节点为上一个小时实例,定时时间12:00的实例依赖定时时间11:00的实例(依赖线:虚线,小时任务设置了跨周期依赖,依赖项:本节点)

天任务依赖小时任务时,如何实现天任务依赖小时任务昨天所有的小时实例。而非当天所有小时实例?

原理说明:天任务依赖小时任务昨天所有小时实例,天任务需要跨周期依赖小时任务。

实时场景:当天任务需要依赖小时任务当天所有实例。

  • 依赖关系设置:

    • 下游天任务配置:跨周期依赖小时任务,即在调度配置时间属性区域,选择依赖上一周期 > 小时任务节点id。

    • 上游小时任务配置:无需配置

  • 运维中心依赖关系查看:

    下游天实例右键查看父节点会显示依赖小时任务昨天所有小时实例。(依赖线:虚线,天任务设置了跨周期依赖小时任务)

什么情况下配置依赖上一周期的依赖项为本节点?

业务场景:如果当前节点本周期任务运行需要依赖上一周期当前节点产出的节点数据时,当前节点可以设置自依赖。即当前节点上一周期实例执行完成后,当前节点下一周期的实例才去执行,避免当前实例取数时,上一周期实例还在执行(数据还未产出)。

  • 本节点依赖自己上一周期产出的数据,如果您需要确认上一周期产出数据的时间,请在任务的调度配置 > 时间属性区域,配置依赖上一周期 > 本节点

  • 小时任务依赖天任务,当上游天任务运行完成时,已到下游小时任务的多个周期定时时间,导致小时任务多周期并发调度。此时您可以在任务的调度配置 > 时间属性区域,配置依赖上一周期 > 本节点

下游节点同时依赖多个任务运行时,依赖关系如何配置?

如果下游节点同时配置上了依赖多个任务,是否需要依赖所有节点需要您进行业务判断,如果表数据有强相关依赖的,建议将所有节点都设置上依赖关系。节点是否需要设置依赖关系,请参考为什么要设置调度依赖

例如,下游节点C同时依赖日调度任务B及当天的小时调度任务A,小时调度任务输出结果为表A,日调度任务输出结果为表B,下游节点C需要依赖表A及表B运行。

假设下游节点C中涉及查询表A及表B的相关数据,当您仅配置依赖的上游节点为小时调度任务A,而未配置依赖的上游节点为日调度任务B,则可能在上游节点的日调度任务B未执行完成时,下游节点C便开始执行节点任务,导致获取日调度任务的输出表B的数据失败,任务运行报错。因此,该示例中,您需要将日调度任务及小时调度任务均配置为下游节点C依赖的上游节点

如果下游节点对上游表没有强依赖关系,即下游节点取任何时候上游表数据都没有问题(即使上游节点最新表数据也未产出),这种情况下,可以不设置节点依赖关系。

上游A是小时任务,下游B是日任务,任务每天在A任务全部执行完成后要汇总执行一次,小时任务运行到第二天,天任务是否会运行,参数是否会影响

日任务B直接依赖小时任务A当天的实例,日任务B会汇总当天的小时任务。如果小时任务完成最后一个实例的运行,已经到了第二天,则下游的日任务仍会执行。只是运行时间不同,调度参数替换不受影响。

节点A每天每小时整点执行一次,节点B每天运行一次。如何设置节点A每天第一次运行成功后,节点B便开始执行?

配置节点A时,需要勾选依赖上一周期,并选择本节点。节点B的定时时间配置为0点,则每天自动调度实例中,节点B的实例仅依赖节点A在0点生成的实例,即节点A的第一个实例。

有A、B、C三个任务,如何实现每个小时执行一次A->B->C(A执行完了B再执行,B执行完了C再执行)的任务流程?

  1. 依赖关系设置:将A、B、C的依赖关系设置为A的输出为B的输入,B的输出为C的输入。

  2. 调度频率设置:由于调度配置为节点维度的配置,所以如果3个节点都需要小时调度,需要A、B、C的调度周期均设置为小时才可。

如何设置跨业务流程,同地域跨项目依赖?

原理说明:上游节点的输出作为下游节点的输入形成节点依赖关系。在需要设置依赖关系的节点输入处添加需要依赖的节点(跨项目,跨业务流程)的节点输出即可。

已配置失败重跑的任务在运行失败后未重跑,并报错Task Run Timed Out, Killed by System!!!

  • 报错内容:

    当目标任务调度配置时间属性中,重跑属性配置为运行成功或失败后皆可重跑运行成功后不可重跑,运行失败后可以重跑,实际执行任务时,该任务在运行失败后未重跑,并产生Task Run Timed Out, Killed by System!!!报错。

  • 可能原因:

    该任务调度配置时间属性中,配置了超时时间。当任务的运行时长超过超时时间,任务自动终止运行。由于超时导致运行失败的任务不会触发任务重跑。

  • 解决方案:

    当任务运行出现超时失败时,失败重跑机制不生效,您需手动重启相关任务。