调度依赖关系是您构建有序业务流程的根本,只有正确构建任务依赖关系,才能保障业务数据有效、适时地产出,形成规范化的数据研发场景。

在DataWorks使用上,通过代码自动解析+设置节点依赖关系配置节点依赖,通过上下游关系正常及节点运行状态来保障业务数据的顺序产出。

设置节点依赖关系的目的:检测SQL所查询的表的数据的产出时间,通过节点的状态成功默认上游数据数据顺利产出。

您可将上游节点的本节点输出作为下游节点的本节点输入,以形成依赖关系。

DataWorks V2.0提供自动推荐自动解析自定义配置三种依赖配置模式。依赖关系实际操作示例请参考设置调度依赖最佳实践

无论如何配置依赖关系,调度的总逻辑不变:上游执行成功之后才会触发下游调度。因此,所有工作流节点都必须至少有一个父节点,调度依赖的核心就是设置这个父子依赖关系。下文将为您详细介绍调度依赖的原理及配置方式。
说明
  • 2019年1月10号之前创建的项目,存在数据问题,需要提交工单进行修正申请。1月10号之后创建的项目,则不受影响。
  • 您可以观看DataWorks V2.0常见问题与难点分析学习依赖关系配置与排错。

规范化数据开发场景

  • 在进行调度依赖关系配置前,您需要了解以下基本概念:
    • DataWorks任务:定义对数据执行的操作,详情请参见基本概念
    • 输出名称:系统将为每个节点默认分配一个以.out结尾的输出名,同时您也可增加自定义输出名,但需注意输出节点名称在租户内不允许重复。详情请参见基本概念
    • 产出表:指某节点的SQL语句中,INSERT/CREATE语句之后的表。
    • 输入表:指某节点的SQL语句中,FROM后的表。
    • SQL语句:此处指MaxCompute SQL

    实际工作中,一个DataWorks任务中可以包含单个SQL语句,也可以包含多个SQL语句。

    每个形成上下游关系的任务均通过输出名进行关联,其中创建的最上游节点的上游节点可配置为本项目的根节点(节点名projectname_root)。

  • 规范化数据开发原则
    在规范化的数据开发流程中,会构建多个SQL任务形成具有依赖关系的上下游,同时建议遵循以下原则:
    • 下游任务的输入表必须是上游任务的产出表。
    • 同一张表仅由一个任务产出。
    • 一个任务只产出一张表。

    目的是为了当业务流程无限膨胀时,可快速地通过自动解析方式配置复杂的依赖关系。

  • 规范化数据开发流程示例

    上图中,各任务及其代码如下:
    • Task_1任务代码如下,本任务的输入数据来自ods_raw_log_d表,数据输出至ods_log_info_d表。
      INSERT OVERWRITE TABLE ods_log_info_d PARTITION (dt=${bdp.system.bizdate})
        SELECT ……  //代表您的select操作
        FROM (
        SELECT ……  //代表您的select操作
        FROM ods_raw_log_d
        WHERE dt = ${bdp.system.bizdate}
      ) a;
    • Task_2任务代码如下,本任务的输入数据来自ods_user_info_dods_log_info_d表,数据输出至dw_user_info_all_d表。
      INSERT OVERWRITE TABLE dw_user_info_all_d PARTITION (dt='${bdp.system.bizdate}')
      SELECT ……  //代表您的select操作
      FROM (
        SELECT *
        FROM ods_log_info_d
        WHERE dt = ${bdp.system.bizdate}
      ) a
      LEFT OUTER JOIN (
        SELECT *
        FROM ods_user_info_d
        WHERE dt = ${bdp.system.bizdate}
      ) b
      ON a.uid = b.uid;
    • Task_3任务代码如下,本任务输入数据来自dw_user_info_all_d表,数据输出至rpt_user_info_d表。
      INSERT OVERWRITE TABLE rpt_user_info_d PARTITION (dt='${bdp.system.bizdate}')
      SELECT ……  //代表您的select操作
      FROM dw_user_info_all_d
      WHERE dt = ${bdp.system.bizdate}
      GROUP BY uid;

依赖的上游节点

依赖的上游节点指当前节点依赖的父节点,此处需填写上游节点的输出名称(一个节点可同时存在多个输出名称,视情况填写您需要的输出即可),而非上游节点名。您可手动搜索上游输出名进行添加,也可通过SQL血缘关系代码解析得到。

说明 依赖的上游节点,必须使用上游节点的输出名或输出表名进行检索。

如果您通过手动搜索上游输出名添加,则搜索器会根据已提交至调度系统中的节点的输出名来进行搜索。

  • 通过输入父节点输出名搜索

    您可以通过搜索某节点的输出名,将其配置为本节点的上游依赖来形成依赖关系。

  • 通过输入父节点输出名的表名称进行搜索
    通过该方法搜索必须保证父节点的某一个输出名,为本节点SQL语句中INSERT或CREATE之后的表名称,形如projectname.表名(此类输出名一般可通过自动解析获得)。

    执行提交后,该输出名即可通过搜索表名的方式被其他节点搜索到。

本节点的输出

本节点的输出指当前节点的输出,您可在右侧的调度配置页面截取本节点的输出信息。

系统将为每个节点默认分配一个以.out结尾的输出名,同时您也可增加自定义输出名或通过自动解析获得输出名。
说明 输出节点名称是全局唯一的,在整个阿里云账号内不允许重复。

自动解析依赖关系

DataWorks将根据任务节点中实际的SQL内容解析出不同的依赖关系,解析得到的父节点输出名称、本节点输出名称分别为:
  • 父节点输出名称:projectname.INSERT后的表名。
  • 本节点输出名称:
    • projectname.INSERT后的表名。
    • projectname.CREATE后的表名(一般用于临时表)。
说明 如果您是从DataWorksV1.0升级至DataWorks V2.0的用户,则本节点输出名称为projectname.本节点名。
自定解析依赖关系的原理,如下图所示。

  • Select一张表,该表将自动解析为本节点依赖的上游。
  • Insert一张表,该表将自动解析为本节点的输出。
如果出现的多个INSERT、FROM,则会自动解析出多个输出、输入名称。

如果您构建了存在依赖关系的多个任务且满足条件:下游任务的输入表均来自上游任务的输出表,则通过自动解析功能即可实现全工作流依赖关系的快速配置。

说明
  • 为提高任务的灵活性,建议一个任务仅包含一个输出点,以便您可灵活组装SQL业务流程,达到解耦的目的。
  • 如果SQL语句中的一个表名既是产出表又是被引用表(被依赖表),则解析时只解析为产出表。
  • 如果SQL语句中的一个表名被多次引用或被多次产出,则解析时只解析一个调度依赖关系。
  • 如果SQL代码中有临时表(例如在属性配置中指定t_开头的表为临时表),则这个表不会被解析为调度依赖。
在自动解析的前提下,您可通过手工设置添加/删除、输入/输出的方式来决定避免/增加某些SQL语句中的字符被自动解析为输出名/输入名。

选中表名后右键单击,即可对SQL语句中出现的所有表名进行输出、输入的添加或删除。操作后,被添加输入的字符会被解析为父节点输出名称,被添加输出的字符则会被解析为本节点的输出。反之,如果选择删除输入删除输出则不会被解析。

说明 除了右键选中SQL语句中的字符,您还可以通过添加注释的方式修改依赖,具体注释代码如下:
--@extra_input=表名 --添加输入
--@extra_output=表名 --添加输出
--@exclude_input=表名 --删除输入
--@exclude_output=表名 --删除输出

自定义添加依赖关系

当通过SQL血缘关系无法准确自动解析节点之间的依赖关系时,您可选择下图中的来自行配置依赖关系。

当自动解析选择为时,您可以单击自动推荐,启用自动推荐上游依赖功能。系统将会基于本项目SQL血缘关系为您推荐产出当前节点输入表的其他所有SQL节点任务,您可根据自身需求,单选或多选推荐列表中的任务,配置为当前节点的上游依赖任务。
说明 被推荐节点需在前一日提交到调度系统,等到第二日数据产出之后方可被自动推荐功能识别到。

常见场景:

  • 本任务输入表≠上游任务产出表。
  • 本任务产出表≠下游任务输入表。

在自定义方式下,您可通过以下两种方式配置依赖。

  • 手动添加依赖的上游节点示例
    1. 新建三个节点,系统会默认为它们分别配置一个输出名称。




    2. 将最上游节点task_1配置依赖本项目root根节点,单击保存

    3. 配置task_2依赖task_1的输出名称,单击保存

    4. 配置task_3依赖task_2的输出名称,单击保存

    5. 配置完成后,单击提交,判断依赖关系是否正确。如果提交成功则说明依赖配置无误。

  • 通过拖拽形成依赖关系示例
    1. 新建三个task节点,将最上游task_1配置依赖上游为根节点,单击保存

    2. 通过拖拽方式将三个task连接起来。

    3. 查看task_2、task_3的依赖配置,可看到已自动生成依赖的父节点输出名。


    4. 配置完成后,单击提交,判断依赖关系是否正确。如果提交成功则说明依赖配置无误。

常见问题

  • Q:自动解析后提交失败,报错依赖的父节点输出projectname.table不存在,不能提交本节点,请先提交父节点。

    A:出现上述情况有以下两种原因。
    • 上游节点未提交,提交后可再次尝试。
    • 上游节点已经提交,但上游节点的输出名不是workshop_yanshi.tb_2。
    说明 通常通过自动解析得到的父节点输出名、本节点输出名会根据INSERT/CREATE/FROM后的表名来得到,请确保配置方式与自动解析依赖关系所介绍的方式一致。
  • Q:本节点的输出中,下游节点名称、下游节点ID都是空且不能填写内容?

    A:如果本节点下游无子节点,则无内容。待本节点下游配置子节点后,便会自动解析出内容。

  • Q:节点的输出名称用来做什么?

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

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

    A:可以。下游节点引用本节点的任何一个输出名称作为下游节点的父节点输出名称,都将与本节点建立依赖关系。

  • Q:多个节点可以有相同的输出名称吗?

    A:不可以。每个节点的输出名称必须在阿里云账号中是唯一的,如果需要多个节点产出数据至同一张MaxCompute表,那么这些节点的输出建议用表名_分区标识。

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

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

  • Q:最上游任务应如何配置依赖关系?

    A:一般情况下可选择依赖在本项目根节点上。

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

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

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

    A:将A、B、C的依赖关系设置为A的输出为B的输入,B的输出为C的输入,同时设置A、B、C的调度周期都为小时即可。

  • Q:依赖的上游没有解析到父节点ID,提交报错。

    A:该报错并不是指该表不存在,只是在说明该表不是某个节点的本节点输出,无法通过此表去找到产出这个表数据的节点,从而与这个节点挂上依赖。

    通过上游节点的本节点输出作为下游节点的本节点输入,根据上文自动解析的原理可知,在SQL中查询xc_demo_partition表,但自动解析时没有通过此表找到上游节点,说明没有一个节点将这个表xc_demo_partition作为本节点输出。

    您可以通过下述方法解决此问题。

    1. 找到产出该表的节点任务,查看该节点任务的本节点输出。
      如果不知道哪个节点中有操作该表,可以使用代码搜索功能,通过关键字进行模糊查找。

    2. 如果是本地上传的表数据,或者不需要依赖该节点,您可以选择在代码区右键,选择删除输入

    说明 为保证代码血缘的准确性,建议减少使用自定义依赖的次数。