在数据仓库上同步ETL和读取



我有以下场景

  • ETL将数据加载到DW中
  • 报告按需运行,可能与ETL同时运行,消耗来自DW的数据

这是我的问题:我需要确保报告不包含部分数据:

  • 如果在ETL准备加载数据时正在运行报告,则ETL必须等待报告完成
  • 若正在加载ETL并请求报告,则报告必须等待ETL完成
  • 若ETL正在等待加载并请求报告,则报告必须等待ETL运行并完成——ETL始终优先于报告

实现这一点的最佳机制是什么?数据库锁似乎不够智能,无法管理我需要的优先级。

我应该实现自己的锁定机制吗?如果是的话,它有知名的设计吗?必须考虑许多因素:跟踪当前运行的报告(读取时锁定),在ETL失败通知完成时实现锁定过期,等等。

如果您正在使用Cognos,那么我认为您基本上不太幸运,因为设置了"如果ETL正在运行,则阻止报告运行",除非您想在文档不好的API中捣乱。

最好的办法是识别特定的报告,通常是针对聚合运行的报告,并确保您设置了ETL流程,以便最后更新事实和聚合,并将其作为一个大的"更新"事务。如果您使用的dbms能使您的读取一致性,那么您应该能够做到这一点,而不会出现只加载了一半数据的报告

访问多个事实/多个标记的报告会更麻烦。甚至可能需要设置某种"表交换",在其中构建所需的内容,然后alter table rename来交换表。

您可以让etl进程在启动时在表中的记录中设置标志,并在完成时取消设置标志吗?然后,报告系统可以查询该表,查看是否设置了标志,并通知用户仓库正在运行,然后将报告放入ETL过程完成时处理的队列中,或者告诉用户稍后再试。如果您希望允许用户使用已处理的事实,那么您的标志表需要处于表粒度,即每个表的标志记录上。

最新更新