ETL DAG调度策略
2024-08-26 03:57:49
1.目前etl的fetch task策略是基于任务子孙任务数和任务优先级获得task list
2.然后遍历task list 查看任务是否具备执行条件
- 集群资源校验(yarn/hdfs)<如果这里有性能瓶颈,可以抽出来做公共接口map,每10s更新一次>
- 数据是否准备好(仅mysql task具备),解决主从延迟问题
- 任务开始时间
- 任务的父任务是否都执行成功
3.每10s fetch一次task,遍历一次基于<2>的逻辑
- 我们把任务的父任务执行状态判断放到最后是想降低数据库查询成本(如果没放到最后,可以在exec_log表中维护一个依赖是否校验的状态去动态变更来减少数据库轮训查找成本)
- 我们如何避免,如 a->b->c 依赖关系,a还没完成又去校验b,b又没通过,又去校验c这种情况呢(如果此树较大,我们又是基于子孙任务数排序的话,会出现这种无谓遍历数据库的情况)。如果我们没有维护全局树及树中各任务的状态的话(成本较高,要时刻保证内存中的树与mysql表的任务状态同步)。
- 我们可以这么做(较少数据库的无谓遍历),在任务初始化时把任务依赖的dag加载的map中,并只维护任务与其一级子任务的关系如(<1,[2,3,4]> 父任务id:1,子任务id:2,3,4),然后在任务a校验没通过时,把a的一级子任务加入到list(此处不能放入set中,以为不能使用去重的集合,一个子任务可能会有多个父任务)中,依次遍历按照如此逻辑,在这一轮遍历结束后清空list。(或者维护全局list,在此任务校验通过后,从set清除此任务的一级子任务)---此种策略适用于只基于子孙任务数的排序方式,如果还有基于权重的排序并且权重只更新了子任务而没有更新此子任务的上游所有父任务就会出现严重问题
- 索性不如在每次fetch时就拿出子与父的map关系及当时的任务状态,作为任务提交时的判断,这样每fetch一次只与数据库交互一次
最新文章
- MapReduce类型与格式(输入与输出)
- 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录,
- Git使用命令
- mvc的自带json序列化的datetime在js中的解析
- servlet监听器Listener(理论+例子)
- [转载]void及void*的深度剖析
- 解决Centos7安装后无法联网的问题
- 利用HTML5开发Android(3)---Android中的调试
- Android游戏背景音乐音效音量控制
- 关于spring管理hibernate事物
- 给postfix设置黑名单
- 关于 width;height
- (转载)shell变量基础—shell自定义变量
- 二分图的最大匹配-hdu-3729-I&#39;m Telling the Truth
- 代码,显示IPhone剩余磁盘空间
- js 数组的常用方法
- javascript中 for-in和 for-of的区别
- NOIP2007奖学金题解——洛谷1093
- The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored(E F G H I)
- [20180819]关于父子游标问题(11g).txt