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

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

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

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

DataWorks支持自动解析自定义配置依赖关系,操作详情请参见设置调度依赖最佳实践

无论如何配置依赖关系,调度的总逻辑不变:上游执行成功之后才会触发下游调度。因此,所有工作流节点都必须至少有一个父节点,调度依赖的核心就是设置这个父子依赖关系。下文为您详细介绍调度依赖的原理及配置方式。
说明 2019年1月10日之前创建的工作空间,存在数据问题,需要提交工单申请修改。2019年1月10日之后创建的工作空间,则不受影响。

规范化数据开发场景

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

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

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

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

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

  • 规范化数据开发流程示例开发流程
    上图中,各任务及其代码如下:
    • ods_log_info_d任务代码如下,本任务的输入数据来自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;
    • dw_user_info_all_d任务代码如下,本任务的输入数据来自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;
    • rpt_user_info_d任务代码如下,本任务输入数据来自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后的表名(通常用于临时表)。
下图为自动解析依赖关系的原理。自动解析
  • SELECT一张表,该表将自动解析为本节点依赖的上游。
  • INSERT一张表,该表将自动解析为本节点的输出。
如果出现的多个INSERT、FROM,则会自动解析出多个输出、输入名称。自动解析
如果您构建了存在依赖关系的多个任务且满足条件:下游任务的输入表均来自上游任务的输出表,则通过自动解析功能即可实现整个业务流程依赖关系的快速配置。快速配置
  • 为提高任务的灵活性,建议一个任务仅包含一个输出点,以便您可以灵活组装SQL业务流程,达到解耦的目的。
  • 如果SQL语句中的一个表名既是产出表又是被引用表(被依赖表),则解析时只解析为产出表。
  • 如果SQL语句中的一个表名被多次引用或被多次产出,则解析时只解析一个调度依赖关系。
  • 如果SQL代码中有临时表(例如在工作空间配置中指定t_开头的表为临时表),则该表不会被解析为调度依赖。
在自动解析的前提下,您可以通过手工设置添加或删除、输入或输出的方式,来决定避免或增加某些SQL语句中的字符被自动解析为输出名、输入名。自动解析

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

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

自定义添加依赖关系

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

当自动解析选择为时,请单击自动推荐,启用自动推荐上游依赖功能。自动推荐
系统将会基于本工作空间的SQL血缘关系,为您推荐产出当前节点输入表的其它所有SQL节点。您可以根据自身需求,单选或多选推荐列表中的任务,配置为当前节点的上游依赖任务。
说明 由于需要提交发布至生产环境并真实产出该表数据的节点,才会被解析出来,所以此处解析的节点有T+1的延迟。

被推荐节点需要在前一天提交至调度系统,等到第二天的数据产出之后,才可以被自动推荐功能识别。

常见场景:
  • 本任务输入表≠上游任务产出表。
  • 本任务产出表≠下游任务输入表。
在自定义方式下,您可以通过以下两种方式配置依赖:
  • 手动添加依赖的上游节点示例
    1. 新建三个节点,系统会默认为它们分别配置一个输出名称。
      • task_1的输出名称为workshop_y****.500022365.outtask1
      • task_2的输出名称为workshop_y****.500022366.outtask2
      • task_3的输出名称为workshop_y****.500022367.outtask3
    2. 配置最上游节点task_1依赖本工作空间根节点,单击工具栏中的保存图标。task1依赖
    3. 配置task_2依赖task_1的输出名称,单击保存图标。task2依赖
    4. 配置task_3依赖task_2的输出名称,单击保存图标。task3依赖
    5. 配置完成后,单击提交,判断依赖关系是否正确。如果提交成功则说明依赖配置无误。提交
  • 通过拖拽形成依赖关系示例
    1. 新建三个task节点,将最上游task_1配置依赖上游为根节点,单击保存图标。保存
    2. 通过拖拽方式将三个task连接起来。
    3. 查看task_2、task_3的依赖配置,可以看到已自动生成依赖的父节点输出名。task_2task_3
    4. 配置完成后,单击提交,判断依赖关系是否正确。如果提交成功则说明依赖配置无误。提交

跨项目(工作空间)依赖

DataWorks目前支持同区域下的跨项目依赖,配置方法与普通依赖相同。
说明 对于部分早期创建的工作空间,标准模式工作空间依赖简单模式工作空间可能无法支持,请提交工单申请修复。