摘 要: 如何實(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ī)超過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的過程進(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ù)日志。可以在操作系統(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ù),,在分析日志的過程中將變更數(shù)據(jù)分類為普通變更數(shù)據(jù),、準(zhǔn)實(shí)時(shí)變更數(shù)據(jù)和實(shí)時(shí)變更數(shù)據(jù),分別送至不同的數(shù)據(jù)傳輸通道,。實(shí)時(shí)數(shù)據(jù)通過消息中間件的消息隊(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] 楊樂.數(shù)據(jù)倉(cāng)庫(kù)中實(shí)時(shí)抽取機(jī)制的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),,2007.