注意事项
调度时间仅定义任务预期执行时间,其实际执行时间还受上游执行情况控制
DataWorks上任务一旦设置依赖,即表示上下游任务间存在数据依赖。无论下游任务定时运行时间为几点,均需等上游任务执行完成后,下游才满足可执行条件
下游任务一旦挂载依赖,若上游任务非运行成功状态,即使到达下游任务的定时运行时间,该任务也不会执行。
其他说明
任务各周期是通过实例的方式执行
调度任务会根据调度类型及周期数生成相应的周期实例(例如,小时调度任务每天会根据周期数产生相应数量的小时实例),通过实例的方式运行任务。周期任务设置的依赖关系,其本质是任务间所生成实例的依赖。上下游任务的调度类型不同,其生成的周期实例数及实例的依赖情况不同。
就近原则:
DataWorks的周期任务运行时会生成多个周期实例,下游周期实例会依赖上游周期实例(该上游实例需在当前下游实例的定时运行时间之前产生)。
下游任务的定时运行时间若早于上游任务,即便到达下游任务的定时时间,该任务也不会被调度,需等待上游任务运行完成后才会调度运行。
下游依赖上游时:
用的是相同周期的结果,
还是上一周期的结果.
其中跨周期依赖还可以依赖自己的上一个实例.
fdl目前没有周期的概念. 也没法实现自依赖.-----内置参数可以?
fdl目前只能依赖于上游任务在指定时间范围内的所有实例.
目前的增强依赖会把所有存在依赖关系的任务放到一个依赖图中. 但这样会因为有维度表的存在, 导致不同业务域的任务全都出现在一个依赖图中.
而DataWorks支持通过 依赖其他节点 的方式, 依赖工作空间/业务流程的输出表
问题:
下游任务每次执行前是检查上游任务的最近一次执行记录,然后根据条件判断是否执行吗;如果A依赖任务B,任务B周执行一次,A每小时执行一次,A每次都是根据B的上周记录判断的?
1、小时任务依赖天任务,天任务设置每天08:00执行,小时任务在08:00之后,每小时执行一次吗
下游任务的定时运行时间若早于上游任务,即便到达下游任务的定时时间,该任务也不会被调度,需等待上游任务运行完成后才会调度运行?
2、如果设置了事件调度,但下游任务又设置了定时调度,是排队吗
3、小时任务依赖小时任务:
上下游周期数(即生成的实例数)一致
上下游任务运行当天生成的周期实例,将一一对应挂载依赖。即下游首个实例依赖上游首个实例,下游第二个实例依赖上游第二个实例,以此类推。
上下游周期数(即生成的实例数)不一致
上下游任务运行当天生成的周期实例,将根据就近原则挂载依赖,依赖距离自己定时运行时间最近(在当前实例定时时间之前,或与当前实例定时时间一致)的上游实例。
当上游周期数小于下游周期数时,下游多个周期实例可能会依赖同一个上游周期实例。
4、小时任务依赖天任务
1. 几种调度模式
1.1 定时调度
周期性调度,设置定时任务的执行频率。
批量设置任务的调度
功能简介:
可为定时任务设置执行频率,定期自动运行定时任务,以保证数据能够及时更新,一个定时任务可设置多个执行频率
应用场景:
任务本身按照频率执行
数据仓库周期性数据变化
每天交易数据的抽取加载(当天将前一天数据更新入库)
优势:
易于管理和维护、规则简单
金融类外企/银行的工作日和节假日执行时间非正常工作日,定时任务的调度时间需要自定义
目前 corn 表达式的使用成本比较高,需要降低使用成本
客户需要在各交易所工作日表/节假日等时间执行一些调度。
某些任务希望能够在法定节假日不执行,同时因为客户这边有多个地区的法定假日规则,希望可以自定义工作日&法定假日日历(客户跨国际业务,需要支持不同国家节假日,这个不是核心阻塞需求)
客户会维护一张数据表,将需要任务执行的日期按照客户行业的特征进行个性化设计。调度配置可以读取数据表,若当天不在日期表内,则控制 fdl 任务不执行。自定义调度
定时任务调用接口
调用接口就能执行任务A
高度灵活,实时响应用户系统数据的变化
执行过程中需要基于外部事件或者触发器,比如数据库表中的变更数据,通过外部业务系统推送实时变更数据,实时响应的实时数据处理
接口:定时任务相关接口介绍
1.2 事件调度
可以不立即触发;批量设置任务的调度
应用场景:
多任务间的调度
用户设置好数仓任务后,设置上游任务在上午更新,希望下午资源空闲时分去定时触发下游大表更新。
用户希望 ods 层任务完全更新成功之后,更新后会一起触发一次下游 dw 层任务。
用户设置 A、B 任务触发 D 任务,A、B任务都失败,未触发下游任务 D,希望能够重跑任务,若两个任务均重跑成功则触发下游任务。
a/b/c任务设置3点之后执行,执行完成则触发d任务执行
a任务成功则触发b任务
多任务事件触发单任务;a任务的某两个节点成功 则触发b任务执行
多任务事件触发多任务;a/b/c任务成功则触发b/d/f任务自动执行
https://kms.fineres.com/pages/viewpage.action?pageId=1003881288
数仓场景:
任务分层,但是每个层级里的任务调度频率不一致;
主要问题:集群调度并发是400,一个ODS-MES层300个任务会配在一个批量调度计划中,但是仅需要调度计划内去配并发10个任务,一下子跑300任务会对同个数据库造成巨大压力。
主要问题:简道云的大表8000w需要在下午空闲时间去触发执行,需要判断上游任务是否是最新数据,而不是上游跑完立即触发造成资源紧张。
ods层每个任务的频率是不一致的,一个任务一张表,有分钟/小时/天任务,小时级任务仅需触发一次天任务即可,调度都是配在单个任务里的,不会用批量调度计划,所以依赖也是单独配任务。(信息组)
数仓分层,ods层是调度频率不一致的,基本也是一个任务一张表,维度表——>事实表,下游会根据任务去配,更期望使用拖拉拽可视化方式去配置,目前的易用性客人更愿意去用调度任务配置并且关系更清晰。
任务分层,每个层级的调度频率相对一致;
ods 层是一个批量调度计划,dwd层的也是一个批量调度计划,dwm层里的任务会有依赖关系:维度表—>事实表,dws 层也是有先后依赖关系的。数仓层级大关系是客户一定要ods层跑完才会跑dwd层,并且每个任务一天就跑一次。(江苏固德威电源科技股份有限公司)
任务分层,每个层级调度频率一致,但是需要错峰依赖。
ODS层的A/B任务先跑完就可以触发DW层的C任务了,不用等ODS层所有任务都执行完,节省整体的任务调度时间。(海尔金控)
调试场景:
开发人员已经设置了依赖任务的配置,主场景①修改调试了上游任务中部分节点,触发了下游任务导致数据不准确的问题;次场景②中间任务存在紧急需求更改并需要执行时拉起部分下游任务,全部下游被拉起会造成资源浪费&耗时问题
运维场景:
运维人员在任务失败后利用实例重试补数据,痛点是该任务下游任务不会延续上游任务指定的时间参数,而是当前时间的参数,导致了下游数据数据不准确的问题。
事件调度新优化:
应用场景:
客户有数据快照的场景,每天更新一遍,同时任务上下游有依赖关系,需要用到任务依赖,这样会存在一个问题。 假设有两个任务A,B,B依赖A。 A,B都是快照,每天更新一次。 如果前天的任务A跑失败了,使用补录功能, 给A传了前天的日期参数重新跑起来,那么B也会跟着跑,但是这时候B跑的就不是前天的数据,而是最新日期的数据。
重试A时,B也会跟着执行,但其实不需要他实行
调试的任务,不拉起下游任务
调度周期执行前判断执行依赖的任务是否完成
"期望调度周期执行前支持判断执行依赖的任务是否完成。
客户目前没有替代方案。
客户那边设置的ods层7点,dim层8点,dim层依赖ods层,客户期望到8点的时候,dim层判断下,ods层是否执行完毕,执行完毕就执行dim层,没有就不执行,等到ods层执行完毕再执行dim层。这是因为客户那边在做任务时,会避开某一层的执行时间,例如7.00到8点运行ods层任务,这段时间就不会去动相关任务。"
天任务依赖小时任务
周任务依赖天任务,周任务一周一次,天任务一天一次:
事件依赖可以控制下游的频率。
"依赖任务支持批量选择任务
询问测试了,写的时候扒聊天记录
场景 | 使用流程模拟 |
---|---|
客户上游任务在上午更新,下午资源空闲时分,去定时触发下游大表更新 | 事件调度,下游任务配置项中选择定时触发:每天下午1点触发 由于是依赖的当天上游任务,则判断条件:所有上游任务在最近13小时内运行成功(即当天0点开始产生的最新运行记录参与判断) |
客户ods层任务完全更新成功之后,更新后会一起触发一次下游dw层任务 | 事件调度,dw层任务配置项中选择立即触发 由于ods层任务是设置晚上12点开始更新,一般更新时长最多为4小时内,则判断条件:所有上游任务在最近4小时内运行成功 |
客户A、B任务触发D任务,A、B任务都失败了,未触发下游任务D | 点击A任务的实例重试,运行当前任务及下游,再点击B任务的实例重试,运行当前任务及下游 A、B两次实例都会参与事件调度的判断,当A、B实例成功后触发下游任务D |
1.3 调用任务
立即触发,A任务运行完就立即触发B了
多任务间的调度
父任务A调用子任务B,父任务A可以设置执行频率,等A完成,再执行B
父任务可以给子任务传递参数
父任务和子任务都设置了调度,如果父任务执行时,子任务正在运行,此时父任务触发子任务,则会进入排队等待状态
父任务和子任务都设置了调度,多个父任务先后调用子任务时,子任务将排队执行,按照调用时间排队。
用户希望可以在当前定时任务中调用平台内其他定时任务,被调用的任务被放到当前任务里编排,「调用任务」节点可满足该需求。
应用场景:
https://kms.fineres.com/pages/viewpage.action?pageId=292063648
希望对任务能够设置执行依赖。调用其他任务,完成跨任务的编排
配置被调用的任务,可以选择:
除当前任务以外的任务,当前任务置灰或不在选择列表中。
拥有管理权限的任务,无权限的任务不在选择列表中。若对被调用的任务无管理权限,则不可查看,执行父任务时可正常调用运行。
如果勾选了将当前任务的参数传递给子任务,那么定义的任务参数、参数赋值输出的参数都可以传递给子任务使用。
任务定义的参数:子任务可以直接使用。
参数赋值输出的参数:仅可被子任务的首个节点使用。
、当A任务调用了B任务,并勾选了参数传递,只有在A任务内运行调用B任务时,A任务的参数才可以传递给B任务,单独在B任务内运行,不会获取到A任务里的参数
、父子任务之间的运行没有强相关性,子任务单独运行时也不影响父任务的运行状态。如果子任务正在运行,父任务里也触发到子任务运行,则进入排队状态
父任务构建失败时,子任务也都构建失败,且子任务无运行结果