离线数仓—全流程调度
- 前言
- 一、工作流分析
- 1.工作流依赖关系
- 2.工作流问题
前言
前面完成的数据仓库的所有部分,但是每天运行脚本是有一定的顺序的,且每天要定时执行,因此要对这整个流程进行一个调度,这里先对数仓的工作流进行一个简单的分析。
一、工作流分析
1.工作流依赖关系
依赖关系说明:
1)日志的数据是实时监控的,不需要定期调度,同时mysql中增量表也是实时监控的,也不需要定期调度,只有mysql中的全量表的业务表需要定期上传数据到HDFS中。
2)日志数据和业务数据库中的数据放到HDFS后,每天需要定时将数据放到ODS层中,因此db和log数据到ODS层也需要每天定时调度,且这二者之间无依赖关系,可同时执行。
3)DWD层存放业务事实表,DIM层存放维度表,这两层都要依赖ODS层的两部分数据
4)DWS层1d的表即需要事实表,也需要维度表,所以要依赖DWD层和DIM层
5)DWS层的nd表和td表是再1d表的基础上进行数据装载的,所以要依赖DWS层的1d表
6)ADS层的需求要依赖于DWS的1d、nd、td表以及DWD层的表,但是DWS层的nd、td表完成了就代表这所有的表都完成了,所以箭头只需要指向DWS层的nd、td表
7)ADS层统计完结果后,要导入数据到MySQL中,所以从HDFS的ADS层导入到MySQL中要依赖ADS层
2.工作流问题
上面工作流中的工作单元是一个个脚本。
1)如果一个工作流中的某个工作单元出现了错误,如何进行重跑?
假如一个脚本中的一个语句执行出现了错误,最好不要让整个工作流从头跑,这会让之前没有执行错误的工作单元全部重新跑一边,大大浪费了时间。最好从失败的地方重新跑,即运行出错的语句重新跑,按上面的工作流设计方案,这是没办法完成的,最多只能让运行出错的脚本重新跑。
2)因为同一层的表是没有相互影响的,也就是可以同时执行的,但是脚本中的语句却是串行执行的(all),因此效率不高,如何解决?
让一个表作为一个工作单元,因为脚本中可以只传一个表名,让单个表的语句执行,所以让一个表作为一个工作单元可以同时让多个语句并行执行。
注:因为表比较多,若把工作单元定为一个一个的语句,配置起来就很复杂,这里就先把工作单元定为了一个一个的脚本,而不是表,在实际生产环境中应该是一个语句作为一个工作单元。