摘 要: 如何實(shí)現(xiàn)數(shù)據(jù)倉(cāng)庫(kù)的“動(dòng)態(tài)”特性是部署“動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)”系統(tǒng)的關(guān)鍵所在,而關(guān)鍵的關(guān)鍵又在于如何實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中的實(shí)時(shí)數(shù)據(jù)獲取。以一個(gè)實(shí)際系統(tǒng)為例,提出了一種適用的動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)體系架構(gòu)及實(shí)時(shí)數(shù)據(jù)捕獲與加載解決方案。在實(shí)際系統(tǒng)中驗(yàn)證了該方案的可行性。
關(guān)鍵詞: 動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù);體系架構(gòu);變更數(shù)據(jù)捕獲;實(shí)時(shí)加載
動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)在傳統(tǒng)數(shù)據(jù)倉(cāng)庫(kù)的基礎(chǔ)上增加了對(duì)實(shí)時(shí)決策的支持,為了滿足實(shí)時(shí)決策的要求,就需要最新的實(shí)時(shí)數(shù)據(jù),這就要求動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)能夠及時(shí)準(zhǔn)確地捕獲到有實(shí)時(shí)性要求的變更數(shù)據(jù),并實(shí)時(shí)地將變更數(shù)據(jù)加載到動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中,盡量做到接近零延遲,滿足支持實(shí)時(shí)決策的要求。
本文以某企業(yè)生產(chǎn)線質(zhì)量控制決策分析系統(tǒng)的數(shù)據(jù)倉(cāng)庫(kù)為基礎(chǔ),分析其實(shí)時(shí)決策的需求,提出適合于該特定應(yīng)用的動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)體系架構(gòu)及實(shí)時(shí)數(shù)據(jù)捕獲與加載解決方案。
1 動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)的實(shí)時(shí)決策需求分析
動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)不僅支持傳統(tǒng)的OLAP和數(shù)據(jù)挖掘等分析應(yīng)用,還支持實(shí)時(shí)監(jiān)測(cè)、戰(zhàn)術(shù)決策等實(shí)時(shí)性要求很高的分析。這使得動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)有不同的實(shí)時(shí)性要求,根據(jù)不同的實(shí)時(shí)性需求,可以把動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)分為普通數(shù)據(jù)、有準(zhǔn)實(shí)時(shí)更新要求的數(shù)據(jù)、有實(shí)時(shí)更新要求的數(shù)據(jù)。動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中數(shù)據(jù)的加載方式也可以依此分為傳統(tǒng)ETL批量加載、準(zhǔn)實(shí)時(shí)的小批量加載、實(shí)時(shí)加載。
本文以實(shí)際企業(yè)生產(chǎn)線質(zhì)量控制決策分析系統(tǒng)的數(shù)據(jù)倉(cāng)庫(kù)為例。該數(shù)據(jù)倉(cāng)庫(kù)有基板品質(zhì)分析和電視機(jī)質(zhì)量分析兩個(gè)主題,主題所涉及的信息及充分代表主題的屬性組如表1所示。
針對(duì)此數(shù)據(jù)倉(cāng)庫(kù)的兩個(gè)主題可以進(jìn)行一些OLAP分析,如:一段時(shí)間內(nèi)某種板型的基板合格率(時(shí)間維度+板型維度)。切塊分析,鉆取分析按時(shí)間維度(月,季,年)鉆取。
一段時(shí)間內(nèi)某種機(jī)型出現(xiàn)某種故障數(shù)目(時(shí)間+故障現(xiàn)象+機(jī)型)。切塊分析,鉆取分析按時(shí)間維度(月,季度,年)鉆取。
一段時(shí)間內(nèi)某種機(jī)型的電性能直通率(時(shí)間維度+機(jī)型維度)。切塊分析,鉆取分析按時(shí)間維度(月,季度,年)鉆取。
這些OLAP分析的數(shù)據(jù)只需周期性地更新到數(shù)據(jù)倉(cāng)庫(kù)中,無(wú)須實(shí)時(shí)更新變更數(shù)據(jù)到數(shù)據(jù)倉(cāng)庫(kù)。
目前根據(jù)用戶要求,提出了一系列實(shí)時(shí)控制需求,例如:監(jiān)測(cè)生產(chǎn)線上電視機(jī)故障機(jī)的數(shù)目,每天的故障電視機(jī)超過(guò)N臺(tái)時(shí)要發(fā)出警報(bào)。此時(shí)數(shù)據(jù)倉(cāng)庫(kù)中faultnum屬性的值需要實(shí)時(shí)更新,源數(shù)據(jù)庫(kù)中提供faultnum屬性值的源字段faultcount中的變更數(shù)據(jù)就屬于需要實(shí)時(shí)更新到數(shù)據(jù)倉(cāng)庫(kù)中的實(shí)時(shí)變更數(shù)據(jù)。據(jù)此,本文將針對(duì)該實(shí)際應(yīng)用提出實(shí)時(shí)數(shù)據(jù)捕獲與加載解決方案。
2 數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)集成方式分析
數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)集成方式有以下幾種[1]。
(1)周期性的ETL方式
對(duì)于傳統(tǒng)的數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù),都是采用ETL每隔一個(gè)周期將變化數(shù)據(jù)以文件導(dǎo)入的方式抽取、轉(zhuǎn)換并加載到數(shù)據(jù)倉(cāng)庫(kù)中;對(duì)于有一定實(shí)時(shí)需求的數(shù)據(jù),可以縮短ETL數(shù)據(jù)周期來(lái)達(dá)到準(zhǔn)實(shí)時(shí)的效果。
(2)直接點(diǎn)滴導(dǎo)入
將變更的數(shù)據(jù)實(shí)時(shí)地以數(shù)據(jù)流的形式直接導(dǎo)入數(shù)據(jù)倉(cāng)庫(kù)或者數(shù)據(jù)倉(cāng)庫(kù)動(dòng)態(tài)層的事實(shí)表中。這種數(shù)據(jù)集成方式可以達(dá)到實(shí)時(shí)加載變更數(shù)據(jù)的效果,缺點(diǎn)是當(dāng)加載變更數(shù)據(jù)時(shí)數(shù)據(jù)倉(cāng)庫(kù)不能響應(yīng)查詢。
(3)點(diǎn)滴翻轉(zhuǎn)導(dǎo)入
將變更的數(shù)據(jù)實(shí)時(shí)地以數(shù)據(jù)流的形式導(dǎo)入數(shù)據(jù)倉(cāng)庫(kù)動(dòng)態(tài)層事實(shí)表的一個(gè)副本中,這個(gè)副本與事實(shí)表有相同的結(jié)構(gòu),之后周期地將副本里的數(shù)據(jù)拷貝到事實(shí)表中,再清空表副本接收新的變更數(shù)據(jù)。這種方式可以實(shí)時(shí)地加載變更數(shù)據(jù)同時(shí)始終保持對(duì)查詢的響應(yīng),缺點(diǎn)是當(dāng)變更數(shù)據(jù)的數(shù)據(jù)量很大時(shí)拷貝副本表的時(shí)間空間代價(jià)均比較高。
(4)導(dǎo)入實(shí)時(shí)數(shù)據(jù)緩存
可以在傳統(tǒng)的數(shù)據(jù)倉(cāng)庫(kù)之外設(shè)置一個(gè)單獨(dú)的實(shí)時(shí)數(shù)據(jù)緩存,用來(lái)接收實(shí)時(shí)變更數(shù)據(jù),實(shí)時(shí)數(shù)據(jù)緩存可以用操作數(shù)據(jù)存儲(chǔ)(ODS)來(lái)實(shí)現(xiàn),實(shí)時(shí)查詢可以直接基于ODS進(jìn)行。這樣既可以滿足實(shí)時(shí)加載數(shù)據(jù)的要求,在加載數(shù)據(jù)時(shí)還可以始終保持對(duì)即時(shí)查詢的響應(yīng),還免去了拷貝副本的步驟。
無(wú)論選用何種數(shù)據(jù)集成方式導(dǎo)入數(shù)據(jù),都要滿足以下基本準(zhǔn)則[2]。
(1)不影響源業(yè)務(wù)系統(tǒng)的事務(wù)處理;
(2)數(shù)據(jù)倉(cāng)庫(kù)始終滿足實(shí)時(shí)查詢的要求,不能有非響應(yīng)期;
(3)實(shí)時(shí)性要求高的變更數(shù)據(jù)應(yīng)做到接近零延時(shí)的加載到數(shù)據(jù)倉(cāng)庫(kù)中。
按以上準(zhǔn)則,由于第(2)點(diǎn)的要求,直接點(diǎn)滴導(dǎo)入不適合作為實(shí)時(shí)加載變更數(shù)據(jù)的數(shù)據(jù)集成方式,點(diǎn)滴翻轉(zhuǎn)導(dǎo)入相比導(dǎo)入實(shí)時(shí)數(shù)據(jù)緩存的方式,拷貝副本所用代價(jià)較大,也不適合實(shí)時(shí)加載數(shù)據(jù)。
綜上所述,針對(duì)數(shù)據(jù)倉(cāng)庫(kù)中的不同實(shí)時(shí)性要求的數(shù)據(jù)可以采用不同的數(shù)據(jù)集成策略。對(duì)于傳統(tǒng)的提供戰(zhàn)略分析的數(shù)據(jù),依舊采用ETL導(dǎo)入的方式加載新的數(shù)據(jù),對(duì)于有一定實(shí)時(shí)性要求的分析數(shù)據(jù),可以采用縮短數(shù)據(jù)周期的小批量ETL的方式將變更數(shù)據(jù)加載到數(shù)據(jù)倉(cāng)庫(kù)中(導(dǎo)入到數(shù)據(jù)倉(cāng)庫(kù)動(dòng)態(tài)層的事實(shí)表副本,再拷貝到事實(shí)表中),對(duì)于有很高實(shí)時(shí)性要求的數(shù)據(jù),采用導(dǎo)入實(shí)時(shí)數(shù)據(jù)緩存的數(shù)據(jù)集成方式。
3 動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)體系架構(gòu)
根據(jù)上面的分析,應(yīng)該選擇導(dǎo)入實(shí)時(shí)數(shù)據(jù)緩存的方式來(lái)加載實(shí)時(shí)變更數(shù)據(jù),用小批量ETL加載來(lái)更新準(zhǔn)實(shí)時(shí)要求的數(shù)據(jù)。由此,本文選擇將數(shù)據(jù)倉(cāng)庫(kù)分層,同時(shí)在數(shù)據(jù)倉(cāng)庫(kù)外部單獨(dú)設(shè)立實(shí)時(shí)數(shù)據(jù)緩存的動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)架構(gòu),如圖1所示。
對(duì)多個(gè)源數(shù)據(jù)系統(tǒng)產(chǎn)生的新的變更數(shù)據(jù)分類,需要實(shí)時(shí)加載到數(shù)據(jù)倉(cāng)庫(kù)中的變更數(shù)據(jù)采用某種變更數(shù)據(jù)捕獲策略CDC(Changed Data Capture)加載到以O(shè)DS實(shí)現(xiàn)的實(shí)時(shí)數(shù)據(jù)緩存中;只需要近似實(shí)時(shí)加載到數(shù)據(jù)倉(cāng)庫(kù)中的變更數(shù)據(jù)以小批量ETL的方式加載到數(shù)據(jù)倉(cāng)庫(kù)動(dòng)態(tài)層的事實(shí)表副本中;其他數(shù)據(jù)周期性地以ETL的過(guò)程進(jìn)行更新?;诖藙?dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)的架構(gòu),實(shí)時(shí)戰(zhàn)術(shù)查詢可以直接在ODS上進(jìn)行;戰(zhàn)略決策的查詢分析直接在數(shù)據(jù)倉(cāng)庫(kù)靜態(tài)層進(jìn)行;同時(shí)涉及歷史數(shù)據(jù)和實(shí)時(shí)數(shù)據(jù)的查詢可以借助于ODS的即時(shí)數(shù)據(jù)融合機(jī)制將ODS中的實(shí)時(shí)數(shù)據(jù)即時(shí)匯總更新到數(shù)據(jù)倉(cāng)庫(kù)中的歷史數(shù)據(jù)中,滿足該類查詢的請(qǐng)求。
4 動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)加載
4.1 變更數(shù)據(jù)捕獲
需要實(shí)時(shí)更新到動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)首先必須被變更數(shù)據(jù)捕獲進(jìn)程抓取,實(shí)現(xiàn)變更數(shù)據(jù)實(shí)時(shí)捕獲的方式如下[3]。
(1)掃描新舊數(shù)據(jù)源計(jì)算差分。這種方式需要消耗大量?jī)?nèi)存空間。
(2)利用觸發(fā)器。這種方式會(huì)消耗原系統(tǒng)端的大量資源,影響原業(yè)務(wù)系統(tǒng)的事務(wù)處理性能,違反前面提到的基本準(zhǔn)則。
(3)讀取、分析數(shù)據(jù)庫(kù)的事務(wù)日志??梢栽诓僮飨到y(tǒng)層面讀取事務(wù)日志,這樣就不會(huì)影響原系統(tǒng)的事務(wù)處理,且只需讀取和分析反映了最近變更數(shù)據(jù)的事務(wù)日志,效率比較高。
根據(jù)以上分析,選擇采用讀取、分析事務(wù)日志的方式實(shí)時(shí)捕獲變更數(shù)據(jù)。這種方式的CDC流程如圖2所示。
數(shù)據(jù)庫(kù)中有數(shù)據(jù)更新時(shí)會(huì)先在事務(wù)日志中記載更新日志記錄,日志監(jiān)測(cè)進(jìn)程監(jiān)測(cè)日志的變化,有新的更新日志記錄時(shí)就實(shí)時(shí)地讀取日志,將日志送至日志分析子模塊進(jìn)行分析,得到變更數(shù)據(jù),在分析日志的過(guò)程中將變更數(shù)據(jù)分類為普通變更數(shù)據(jù)、準(zhǔn)實(shí)時(shí)變更數(shù)據(jù)和實(shí)時(shí)變更數(shù)據(jù),分別送至不同的數(shù)據(jù)傳輸通道。實(shí)時(shí)數(shù)據(jù)通過(guò)消息中間件的消息隊(duì)列實(shí)時(shí)發(fā)送到ODS實(shí)時(shí)分區(qū),準(zhǔn)實(shí)時(shí)數(shù)據(jù)暫存在一個(gè)臨時(shí)文件中,以小批量加載的方式導(dǎo)入到數(shù)據(jù)倉(cāng)庫(kù)動(dòng)態(tài)層。普通變更數(shù)據(jù)暫不予傳輸[4]。
4.2 實(shí)時(shí)傳輸變更數(shù)據(jù)
需要實(shí)時(shí)加載到數(shù)據(jù)倉(cāng)庫(kù)中的變更數(shù)據(jù)在被CDC模塊捕獲到之后,還須將其實(shí)時(shí)傳輸?shù)綌?shù)據(jù)倉(cāng)庫(kù)一端,加載到ODS實(shí)時(shí)分區(qū)中。這里借助消息傳輸中間件的消息隊(duì)列傳輸變更數(shù)據(jù)[5],如圖3所示。
CDC模塊首先篩選出需要實(shí)時(shí)更新的變更數(shù)據(jù),將其交給源業(yè)務(wù)系統(tǒng)端的消息隊(duì)列管理器處理,消息隊(duì)列管理器將實(shí)時(shí)數(shù)據(jù)從源業(yè)務(wù)系統(tǒng)端的消息發(fā)送隊(duì)列發(fā)送到訂閱此變更數(shù)據(jù)的數(shù)據(jù)倉(cāng)庫(kù)端的消息接收隊(duì)列,數(shù)據(jù)倉(cāng)庫(kù)端的消息隊(duì)列管理器再將接收到的實(shí)時(shí)數(shù)據(jù)加載到ODS實(shí)時(shí)分區(qū)中,完成實(shí)時(shí)數(shù)據(jù)的加載。
以電視機(jī)質(zhì)量主題中faultnum字段的實(shí)時(shí)數(shù)據(jù)更新為例。在生產(chǎn)線的某一個(gè)信息采集點(diǎn)A,當(dāng)出現(xiàn)一臺(tái)故障電視機(jī)時(shí),操作人員將數(shù)據(jù)庫(kù)中故障機(jī)數(shù)目faultcount的值加1,數(shù)據(jù)在被寫入到數(shù)據(jù)庫(kù)中之前,會(huì)首先在事務(wù)日志中添加反映該操作的更新日志記錄。此時(shí),CDC模塊的日志監(jiān)測(cè)進(jìn)程會(huì)及時(shí)讀取反映實(shí)時(shí)變更數(shù)據(jù)的日志記錄,送至日志分析流程。分析完成后得到變更數(shù)據(jù),并判斷出faultcount屬于數(shù)據(jù)倉(cāng)庫(kù)訂閱的需要實(shí)時(shí)更新的數(shù)據(jù)。于是將實(shí)時(shí)變更數(shù)據(jù)交給消息中間件處理,消息中間件從原系統(tǒng)端的消息發(fā)送隊(duì)列將實(shí)時(shí)數(shù)據(jù)發(fā)送到數(shù)據(jù)倉(cāng)庫(kù)端的消息接收隊(duì)列,數(shù)據(jù)倉(cāng)庫(kù)端的消息中間件將實(shí)時(shí)數(shù)據(jù)取出,用此新的值更新存儲(chǔ)在ODS實(shí)時(shí)分區(qū)中的faultnum字段的值。
動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)是建立在傳統(tǒng)數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)之上的,動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)不僅支持傳統(tǒng)的OLAP分析和數(shù)據(jù)挖掘等決策支持應(yīng)用,還可以滿足實(shí)時(shí)的戰(zhàn)術(shù)決策,因此動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中的部分?jǐn)?shù)據(jù)需要實(shí)時(shí)更新。將實(shí)時(shí)變更數(shù)據(jù)捕獲并加載到動(dòng)態(tài)數(shù)據(jù)倉(cāng)庫(kù)中可以有多種方式,設(shè)計(jì)實(shí)時(shí)數(shù)據(jù)加載方案時(shí)既要考慮可以實(shí)時(shí)地將變更數(shù)據(jù)加載到數(shù)據(jù)倉(cāng)庫(kù)同時(shí)不影響原業(yè)務(wù)系統(tǒng)的事務(wù)處理,也要考慮加載數(shù)據(jù)時(shí)不影響數(shù)據(jù)倉(cāng)庫(kù)響應(yīng)實(shí)時(shí)查詢的要求和原則。
本文基于某企業(yè)生產(chǎn)線質(zhì)量控制決策分析系統(tǒng)提出了一種高效的加載實(shí)時(shí)數(shù)據(jù)的方法。在該數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)常規(guī)運(yùn)作的情況下已驗(yàn)證了此方法可以滿足實(shí)時(shí)捕獲并加載數(shù)據(jù),同時(shí)不影響源業(yè)務(wù)系統(tǒng)的事務(wù)處理。下一步工作將在生產(chǎn)線處于高峰生產(chǎn)狀態(tài),多個(gè)采集點(diǎn)大量頻繁產(chǎn)生實(shí)時(shí)數(shù)據(jù)的情況下,進(jìn)一步證實(shí)此方法在高負(fù)載情況下的可用性與高效性,并進(jìn)一步優(yōu)化捕獲變更數(shù)據(jù)的算法。
參考文獻(xiàn)
[1] 肖裕洪.實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)關(guān)鍵技術(shù)的研究與實(shí)現(xiàn)[D].廣州:華南理工大學(xué),2011.
[2] 徐富亮,周祖德.變化數(shù)據(jù)捕獲技術(shù)研究[J].武漢理工大學(xué)學(xué)報(bào),2009,31(5):740-743.
[3] 林子雨,楊冬青,宋國(guó)杰,等.實(shí)時(shí)主動(dòng)數(shù)據(jù)倉(cāng)庫(kù)中的變化數(shù)據(jù)捕捉研究綜述[J].計(jì)算機(jī)研究與發(fā)展,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] 楊樂(lè).數(shù)據(jù)倉(cāng)庫(kù)中實(shí)時(shí)抽取機(jī)制的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2007.