DataWorks的离线同步节点不支持通过自动解析自动添加调度依赖,包含离线同步节点的业务流程,如果下游节点依赖离线同步节点产生的表,您需手动添加产出表到离线同步节点的输出中,下游节点查询离线同步节点数据时,自动解析可以通过表快速找到产出该表数据的离线同步节点。

易错点

如果您没有将离线同步节点的产出表手动添加到离线同步节点的输出中,自动解析无法找到此离线同步节点,提交引用此离线同步节点的SQL节点时,会出现如下错误提示。离线报错
出现此种错误主要是下游节点中自动解析出来的上游依赖,无法匹配找到对应的上游离线节点,详细原因分析可参见易错原因详解。为避免此类易错点,建议包含离线同步节点的业务流程中,调度依赖配置参考以下两种方式进行配置:

配置方法1:手动将离线节点产出表添加为本节点产出

通过上述报错原因分析可见,如果要避免此类错误需保障下游节点自动解析出来的上游依赖,被添加至上游节点的本节点的输出中。因此,在完成上述几个步骤后,您可以在离线节点的调度配置页面,手动将产出表添加为节点输出,如下图所示。手动

配置方法2:离线节点名称与产出表名称保持一致

根据上述流程描述可知:
  • 创建离线同步节点时,会为节点自动生成一个命名规则为projectname.nodename本节点的输出
  • SQL节点引用离线节点产出表时,会为SQL节点自动生成一个命名规则为projectname.tablename依赖的上游节点
  • 为避免报错,需要保障SQL节点中依赖的上游节点名称和离线节点的本节点的输出名称一致。
因此,您可以将离线节点的节点名称(nodename)和离线节点产出的表名称(tablename)保持一致,满足提交节点时不会报错。
说明 自动生成的projectname.nodename本节点的输出是在创建节点时生成的,节点创建完成后,如果修改节点名称,已自动生成的projectname.nodename本节点的输出不会随之改变名称。因此本方法仅适用与创建离线节点时使用,后续修改节点名称与产出表名称一致的场景无法解决本文说明的问题。

易错原因详解

包含离线同步节点的业务流程,以下图为例,常见节点创建和依赖配置操作如下:离线同步
步骤序号 步骤详情 调度依赖配置结果
1 根据业务流程规划,创建各节点。

以上图为例,即创建虚拟节点、离线同步节点、ODPS节点。

在DataWorks中创建节点后,DataWorks自动为各节点生成两个本节点的输出的配置信息,其中一个本节点的输出名称的后缀为_out,一个本节点的输出名称为projectname.nodename
以上图中的离线节点user_1为例,创建节点后,节点即有:
  • 一个名称为*******_out的本节点的输出。
  • 一个名称为doctest.user_1的本节点的输出。
2 根据业务流程规划,为各个节点拉线,明确各节点的运行逻辑顺序上的上下游依赖关系。 在业务流程页面为各节点拉线后,DataWorks根据拉线的结果,自动为各个父节点添加依赖的配置信息。

以上图中的ODPS节点sql_1为例,拉线完成后,离线节点user_1在sql_1的上游,DataWorks自动将user_1的名称为*******_out的输出添加为sql_1的依赖的上游节点

3 为各节点开发任务代码。 在各个节点中开发任务代码时,DataWorks会根据业务代码自动解析,通过代码中的部分输入、输出命令,自动为节点添加本节点的输出依赖的上游节点

以上图中的ODPS节点sql_1为例,如果sql_1节点需要取用离线节点user_1产出的表table_1的数据时,例如出现了类似select * from table_1这类的语句,DataWorks会自动为sql_1添加一条依赖的上游节点,且自动添加的父节点输出名称的命名规则为projectname.tablename,本示例即为doctest.table_1

完成上述步骤后,如果您没有关注到离线节点无法自动解析,为离线节点自动将输出表添加为节点的本节点的输出,您直接提交业务流程节点时,系统会报错,提示您依赖的父节点输出名不存在。离线报错
出现此种错误的原因是:
  • 由于离线节点不支持自动解析,所以离线节点的产出表table_1没有被自动添加为离线节点的本节点的输出。即离线节点user_1没有doctest.table_1这条输出。
  • 离线节点的下游节点sql_1因为自动解析,添加了一条命名规则为projectname.tablename依赖的上游节点,本示例即为doctest.table_1,但是由于doctest.table_1没有作为user_1的输出,所以sql_1中添加的这条父节点依赖无法匹配到user_1的节点ID。
  • 提交sql_1节点时,系统检测到sql_1有doctest.table_1这个上游依赖,但是因为这条上游依赖没有关联到节点ID,系统无法通过这条依赖找到对应的上游节点,出现报错,提示依赖的父节点输出名不存在。