动态数据仓库在传统数据仓库的基础上增加了对实时决策的支持,为了满足实时决策的要求,就需要最新的实时数据,这就要求动态数据仓库系统能够及时准确地捕获到有实时性要求的变更数据,并实时地将变更数据加载到动态数据仓库中,尽量做到接近零延迟,满足支持实时决策的要求。
本文以某企业生产线质量控制决策分析系统的数据仓库为基础,分析其实时决策的需求,提出适合于该特定应用的动态数据仓库体系架构及实时数据捕获与加载解决方案。
1 动态数据仓库的实时决策需求分析
动态数据仓库不仅支持传统的OLAP和数据挖掘等分析应用,还支持实时监测、战术决策等实时性要求很高的分析。这使得动态数据仓库中的数据有不同的实时性要求,根据不同的实时性需求,可以把动态数据仓库中的数据分为普通数据、有准实时更新要求的数据、有实时更新要求的数据。动态数据仓库中数据的加载方式也可以依此分为传统ETL批量加载、准实时的小批量加载、实时加载。
本文以实际企业生产线质量控制决策分析系统的数据仓库为例。该数据仓库有基板品质分析和电视机质量分析两个主题,主题所涉及的信息及充分代表主题的属性组如表1所示。
针对此数据仓库的两个主题可以进行一些OLAP分析,如:一段时间内某种板型的基板合格率(时间维度+板型维度)。切块分析,钻取分析按时间维度(月,季,年)钻取。
一段时间内某种机型出现某种故障数目(时间+故障现象+机型)。切块分析,钻取分析按时间维度(月,季度,年)钻取。
一段时间内某种机型的电性能直通率(时间维度+机型维度)。切块分析,钻取分析按时间维度(月,季度,年)钻取。
这些OLAP分析的数据只需周期性地更新到数据仓库中,无须实时更新变更数据到数据仓库。
目前根据用户要求,提出了一系列实时控制需求,例如:监测生产线上电视机故障机的数目,每天的故障电视机超过N台时要发出警报。此时数据仓库中faultnum属性的值需要实时更新,源数据库中提供faultnum属性值的源字段faultcount中的变更数据就属于需要实时更新到数据仓库中的实时变更数据。据此,本文将针对该实际应用提出实时数据捕获与加载解决方案。
2 数据仓库的数据集成方式分析
数据仓库的数据集成方式有以下几种[1]。
(1)周期性的ETL方式
对于传统的数据仓库数据,都是采用ETL每隔一个周期将变化数据以文件导入的方式抽取、转换并加载到数据仓库中;对于有一定实时需求的数据,可以缩短ETL数据周期来达到准实时的效果。
(2)直接点滴导入
将变更的数据实时地以数据流的形式直接导入数据仓库或者数据仓库动态层的事实表中。这种数据集成方式可以达到实时加载变更数据的效果,缺点是当加载变更数据时数据仓库不能响应查询。
(3)点滴翻转导入
将变更的数据实时地以数据流的形式导入数据仓库动态层事实表的一个副本中,这个副本与事实表有相同的结构,之后周期地将副本里的数据拷贝到事实表中,再清空表副本接收新的变更数据。这种方式可以实时地加载变更数据同时始终保持对查询的响应,缺点是当变更数据的数据量很大时拷贝副本表的时间空间代价均比较高。
(4)导入实时数据缓存
可以在传统的数据仓库之外设置一个单独的实时数据缓存,用来接收实时变更数据,实时数据缓存可以用操作数据存储(ODS)来实现,实时查询可以直接基于ODS进行。这样既可以满足实时加载数据的要求,在加载数据时还可以始终保持对即时查询的响应,还免去了拷贝副本的步骤。
无论选用何种数据集成方式导入数据,都要满足以下基本准则[2]。
(1)不影响源业务系统的事务处理;
(2)数据仓库始终满足实时查询的要求,不能有非响应期;
(3)实时性要求高的变更数据应做到接近零延时的加载到数据仓库中。
按以上准则,由于第(2)点的要求,直接点滴导入不适合作为实时加载变更数据的数据集成方式,点滴翻转导入相比导入实时数据缓存的方式,拷贝副本所用代价较大,也不适合实时加载数据。
综上所述,针对数据仓库中的不同实时性要求的数据可以采用不同的数据集成策略。对于传统的提供战略分析的数据,依旧采用ETL导入的方式加载新的数据,对于有一定实时性要求的分析数据,可以采用缩短数据周期的小批量ETL的方式将变更数据加载到数据仓库中(导入到数据仓库动态层的事实表副本,再拷贝到事实表中),对于有很高实时性要求的数据,采用导入实时数据缓存的数据集成方式。
3 动态数据仓库体系架构
根据上面的分析,应该选择导入实时数据缓存的方式来加载实时变更数据,用小批量ETL加载来更新准实时要求的数据。由此,本文选择将数据仓库分层,同时在数据仓库外部单独设立实时数据缓存的动态数据仓库架构,如图1所示。
对多个源数据系统产生的新的变更数据分类,需要实时加载到数据仓库中的变更数据采用某种变更数据捕获策略CDC(Changed Data Capture)加载到以ODS实现的实时数据缓存中;只需要近似实时加载到数据仓库中的变更数据以小批量ETL的方式加载到数据仓库动态层的事实表副本中;其他数据周期性地以ETL的过程进行更新。基于此动态数据仓库的架构,实时战术查询可以直接在ODS上进行;战略决策的查询分析直接在数据仓库静态层进行;同时涉及历史数据和实时数据的查询可以借助于ODS的即时数据融合机制将ODS中的实时数据即时汇总更新到数据仓库中的历史数据中,满足该类查询的请求。
4 动态数据仓库的数据加载
4.1 变更数据捕获
需要实时更新到动态数据仓库中的数据首先必须被变更数据捕获进程抓取,实现变更数据实时捕获的方式如下[3]。
(1)扫描新旧数据源计算差分。这种方式需要消耗大量内存空间。
(2)利用触发器。这种方式会消耗原系统端的大量资源,影响原业务系统的事务处理性能,违反前面提到的基本准则。
(3)读取、分析数据库的事务日志。可以在操作系统层面读取事务日志,这样就不会影响原系统的事务处理,且只需读取和分析反映了最近变更数据的事务日志,效率比较高。
根据以上分析,选择采用读取、分析事务日志的方式实时捕获变更数据。这种方式的CDC流程如图2所示。
数据库中有数据更新时会先在事务日志中记载更新日志记录,日志监测进程监测日志的变化,有新的更新日志记录时就实时地读取日志,将日志送至日志分析子模块进行分析,得到变更数据,在分析日志的过程中将变更数据分类为普通变更数据、准实时变更数据和实时变更数据,分别送至不同的数据传输通道。实时数据通过消息中间件的消息队列实时发送到ODS实时分区,准实时数据暂存在一个临时文件中,以小批量加载的方式导入到数据仓库动态层。普通变更数据暂不予传输[4]。
4.2 实时传输变更数据
需要实时加载到数据仓库中的变更数据在被CDC模块捕获到之后,还须将其实时传输到数据仓库一端,加载到ODS实时分区中。这里借助消息传输中间件的消息队列传输变更数据[5],如图3所示。
CDC模块首先筛选出需要实时更新的变更数据,将其交给源业务系统端的消息队列管理器处理,消息队列管理器将实时数据从源业务系统端的消息发送队列发送到订阅此变更数据的数据仓库端的消息接收队列,数据仓库端的消息队列管理器再将接收到的实时数据加载到ODS实时分区中,完成实时数据的加载。
以电视机质量主题中faultnum字段的实时数据更新为例。在生产线的某一个信息采集点A,当出现一台故障电视机时,操作人员将数据库中故障机数目faultcount的值加1,数据在被写入到数据库中之前,会首先在事务日志中添加反映该操作的更新日志记录。此时,CDC模块的日志监测进程会及时读取反映实时变更数据的日志记录,送至日志分析流程。分析完成后得到变更数据,并判断出faultcount属于数据仓库订阅的需要实时更新的数据。于是将实时变更数据交给消息中间件处理,消息中间件从原系统端的消息发送队列将实时数据发送到数据仓库端的消息接收队列,数据仓库端的消息中间件将实时数据取出,用此新的值更新存储在ODS实时分区中的faultnum字段的值。
动态数据仓库是建立在传统数据仓库基础之上的,动态数据仓库不仅支持传统的OLAP分析和数据挖掘等决策支持应用,还可以满足实时的战术决策,因此动态数据仓库中的部分数据需要实时更新。将实时变更数据捕获并加载到动态数据仓库中可以有多种方式,设计实时数据加载方案时既要考虑可以实时地将变更数据加载到数据仓库同时不影响原业务系统的事务处理,也要考虑加载数据时不影响数据仓库响应实时查询的要求和原则。
本文基于某企业生产线质量控制决策分析系统提出了一种高效的加载实时数据的方法。在该数据仓库系统常规运作的情况下已验证了此方法可以满足实时捕获并加载数据,同时不影响源业务系统的事务处理。下一步工作将在生产线处于高峰生产状态,多个采集点大量频繁产生实时数据的情况下,进一步证实此方法在高负载情况下的可用性与高效性,并进一步优化捕获变更数据的算法。
参考文献
[1] 肖裕洪.实时数据仓库关键技术的研究与实现[D].广州:华南理工大学,2011.
[2] 徐富亮,周祖德.变化数据捕获技术研究[J].武汉理工大学学报,2009,31(5):740-743.
[3] 林子雨,杨冬青,宋国杰,等.实时主动数据仓库中的变化数据捕捉研究综述[J].计算机研究与发展,2007,44(9):447-451.
[4] Shi Jingang, Bao Yubin, Leng Fangling, et al. Study on Logbased change data capture and harding mechanism in realtime data warehouse[C]. Proceedings of 2008 International Conference on Computer Science and Eftuare Engineering, Wuhan,2008:478-481.
[5] 杨乐.数据仓库中实时抽取机制的研究与实现[D].北京:北京邮电大学,2007.