一、为什么需要设置调度依赖
设置调度依赖是为了保障业务数据有效、适时地产出,形成规范化的数据研发场景。
换句话说就是为了保障下游节点执行时上游数据已经正确产出,避免下游节点取上游数据时上游数据还未产出导致出现数据质量问题。
规范的依赖关系配置后,您无需关心当前节点需要依赖表由哪个节点产出,通过DataWorks自动解析将一键为您设置任务依赖。
那dataworks上是怎么知道上游数据什么事后产出的呢,我们再来具体看下调度依赖在dataworks上的具体实现。
1.1调度依赖在DataWorks上的具体实现
在DataWorks上,产出table_B数据的节点B任务执行完成,平台默认数据已经准备就绪,下游需要依赖该表数据的节点(表)可以开始取数了。
这里有个观念的转变需要注意:
“表之间依赖”转换为“产出表数据的节点之间依赖”
那如何通过表找到产出该表数据的节点,
挂上节点依赖呢?
我们先来看下节点是如果设置上下游依赖。
二、如何设置节点调度依赖
节点依赖是在下游节点去依赖上游节点,Dataworks上通过节点输出来挂依赖的。
上游节点的输出作为下游节点的输入,这样形成依赖关系
【场景示例】
当前节点B产出table_B数据, table_B数据依赖table_A,那么我们将产出表table_A数据的节点作为当前节点B的上游依赖。
我知道需要依赖这个表数据,也知道这个表数据由哪个节点产出,但是我不可能每次需要依赖表的时候,都打开这个节点找到他的输出设置依赖关系,
团队协同开发的时候,也不可能因为需要依赖这个节点,而将该用户加入到项目,这也是不可能的。那怎么办呢?我们继续往下看
三、依赖关系设置的几种方式
我们先来了解一下导读依赖设置的几种方式:
- 自动解析(推荐★)
- 自定义依赖
- 拉线设置依赖
四、自动解析
从上面我们知道了,为了当前节点取数时上游数据已经准备好,当前节点才去取上游数据,为了解决上面说到的问题,我们需要表和节点输出有更直接的关系。而自动解析就是来自动实现表和节点(方便下游用到该表时挂依赖)的关系。
我们先来了解一下 自动解析。
【自动解析】
默认将代码中select的表自动解析将作为节点输入;
默认将代码中insert的表自动解析将作为节点输出。
【示例】
insert overwrite table table_a
as select * from project_b_name.table_b;
血缘关系:
查询project_b_name.table_b的数据写入table_a。
自动解析:
project_b_name.table_b会作为该节点输入,格式为project_b_name.table_b;
table_a会作为该节点的输出,格式为project_a_name.table_a
4.1自动解析和依赖关系
自动解析助您一键设置任务依赖关系。
上游产出该表数据,自动将该表作为节点输出,下游节点再去查这个表数据的时候,自动解析会通过该表找到产出该表数据的节点(一定要注意是否有解析出父节点id),挂上节点依赖关系。
(在这里,我们也可以知道有些自动解析的表依赖提交时候报错的原因,
是因为没有通过该表找到产出该表数据的节点
(没有解析出父节点id)。
为什么没有找到该表数据的节点呢,
因为没有一个节点将这个表作为节点输出了。)
4.2推荐自动解析的原因
1.根据代码的逻辑,判断您在当前节点需要产出某张表。当您以project_name.tablename的方式将其作为本节点输出时,后续其它节点需要查询该表时,您无需关注要依赖哪个节点,您只需要关注要依赖该表当前周期产出的数据。
2.当您无法确定当前工作空间产出该表数据的具体节点时,您可以使用自动解析,帮助您快速开发业务流程。
3.使用自动解析该操作的前提是遵循自动解析规范,也就是产出一个表数据,一定要将这个表作为节点的输出。
4.同地域的工作空间支持自动解析依赖关系,即支持同地域跨工作空间配置节点调度依赖关系(遵循自动解析规范)
【场景】
这个表数据是我本地上传的,自动解析将他解析出来了,但是提交报错依赖的父节点输出不存在
(依赖的父节点那没有解析出父节点),自动解析的依赖关系这里不能删除,该怎么办?
我们先来看一下dataworks上可以手动编辑依赖的几种方式。
五、自定义依赖
1.代码编辑输入输出
2.手动添加上游依赖
3.自动推荐
我们再回到刚刚的问题上:
【场景】
这个表数据是我本地上传的,自动解析将他解析出来了,
但是提交报错依赖的父节点输出不存在,
自动解析的依赖关系这里不能删除,该怎么办?
5.1代码中编辑输入输出
自动解析的依赖再右侧父节点依赖那块删除按钮是置灰的,但是这个表没有解析出父节点id,因为这个表是我本地上传的表数据,而DataWorsk上只有节点产出的表才能挂节点依赖。
(因为DataWorks是通过挂依赖的目的是保障下游取数时候,上游数据已经准确产出,
通过产出表数据的节点执行完成默认数据已经产出,下游节点可以正常取数了,
如果是本地上传的表数据或者不在DataWorks上产出的表,DataWorks是监控不了的哦,所以这里就只能将这个依赖删除了)。
--@extra_input=表名 --添加输入
--@extra_output=表名 --添加输出
--@exclude_input=表名 --删除输入
--@exclude_output=表名 --删除输出
手动添加上游依赖
【场景一】
需要依赖某个表数据。
【场景二】
需要依赖某个节点,不一定存在表血缘依赖。
5.2自动推荐
背景:
在DataWorks2.0版本升级时,大家对调度依赖的理解不是很好,
经常出现提交报错的问题,所以平台推出了这个“自动推荐”这个功能。
当自动解析选择为否时,您可以使用自动推荐功能自定义添加需要依赖的上游节点。
自动推荐功能会自动解析出所有已经提交并发布至生产环境,并且实际运行产出该表的节点。
说明:由于需要提交发布至生产环境并真实产出该表数据的节点,才会被解析出来,所以此处解析的节点有T+1的延迟。
5.3拉线设置依赖
在业务流程面板连线形成依赖关系后,系统会自动将上游节点的输出名称作为下游节点的上游依赖(输入),即上游节点自带的_out输出名称作为下游节点的上游依赖(输入)。
注意:拉线设置依赖的时候自动解析是默认打开的哦
调度依赖场景问题
调度依赖配置建议
• 产出表数据的节点将该表作为节点输出。(方便自动解析自动设置依赖关系)
• 一张表数据由一个节点产出
(通过自动解析知道,节点产出某张表的数据,
自动解析会默认将该表作为节点输出,
而DataWorks是通过节点输出挂依赖的,
需要通过唯一的输出定位到唯一的节点。
所以建议一张表数据由一个节点产出。
如果有场景需要某个表数据由多个节点产出的话,
记得节点输出那删除该表,确保节点输出全局唯一哦)
• 保证节点输出同region下唯一
• 建议任务名称和输出表名保持一致。
同步任务调度依赖配置
同步任务不支持自动解析设置依赖关系,所以需要手动节点产出数据的表作为节点输出,方便下游sql节点自动解析设置依赖关系。如果不想手动添加的话,可以将节点名设置为产出表名,因为对DataWorks会默认添加节点名的输出哦。
同步任务:建议节点名为该同步任务产出的表名。
输入输出和代码血缘分析不匹配的提示
【血缘关系】
表间数据来源与去向,即节点中表select和insert关系。
【血缘关系解析】
代码中select的表自动解析将作为节点输入;
代码中insert的表自动解析将作为节点输出。
【用户提交的输入输出】
用户提交的输入:在调度配置界面的解析出父节点id的输出名(表)。
用户提交的输出:在调度配置界面的本节点的输出名称(表)。
1.为什么会出现血缘关系和用户提交的输入输出不一致的提示?
代码中select/insert的和调度配置那父节点和输出不匹配。
2.需要我们关注什么?
确认这张表的数据源来源及是否需要依赖该表:
•本地上传的表数据或者不在DataWorks上产出的表,可忽略血缘关系不一致的提示
•是DataWorks周期调度产出的表数据,请务必再次确认产出该表数据的节点是否有将该表作为节点输出。
依赖的父节点输出不存在
报错场景:
当前节点产出dw_user_info_all_d表数据,
依赖ods_log_info_d,ods_user_info_d_1表,
其中ods_user_info_d_1表提交报错。
如果当前需要将节点提交上去不报错的解决方式:
1.自动解析设置为否(不推荐×)
自动解析设置为否---血缘关系不一致---当前节点提交正常---下游节点select表dw_user_info_all_d表---提交报错:dw_user_info_all_d不存在--数据质量问题?
2.确认该表数据来源:
【场景一】
本地上传的数据,代码中删除输入,忽略血缘关系提示,提交任务
【场景二】
找到产出表ods_user_info_d_1数据的节点,将该表作为节点输出。
节点输出相同,提交失败
•同region下同名节点需要修改一个节点的输出,因为dataworks会创建一个节点名的输出。
•一个表数据由一个节点产出,因为自动解析会将产出表作为节点输出。
自动解析需要通过唯一的节点输出定位到唯一的节点,
所以需要保障节点输出唯一,
需要修改其中一个节点的节点输出。
删除节点失败,当前节点存在下游
检查开发环境运维中心和生产环境运维中心,是否还存在下游节点依赖该需要下线的节点。
注意:运维中心跨周期依赖(虚线)依赖也需要下线哦