ETL中的數據增量抽取機制【轉】


增量抽取是數據倉庫ETL(extraction,transformation,loading,數據的抽取、轉換和裝載)實施過程中需要重點考慮的問題。在ETL過程中,增量更新的效率和可行性是決定ETL實施成敗的關鍵問題之一,ETL中的增量更新機制比較復雜,采用何種機制往往取決於源數據系統的類型以及對增量更新性能的要求。

1 ETL概述

ETL包括數據的抽取、轉換、加載。①數據抽取:從源數據源系統抽取目的數據源系統需要的數據:②數據轉換:將從源數據源獲取的數據按照業務需求,轉換成目的數據源要求的形式,並對錯誤、不一致的數據進行清洗和加工;③數據加載:將轉換后的數據裝載到目的數據源。

ETL作為構建數據倉庫的一個環節,負責將分布的、異構數據源中的數據如關系數據、平面數據文件等抽取到臨時中間層后進行清洗、轉換、集成,最后加載到數據倉庫或數據集市中,成為聯機分析處理、數據挖掘的基礎。ETL原來主要用戶構建數據倉庫和商業智能項目,現在也越來越多地應用於一般信息系統數據的遷移、交換和同步。

在ETL的3個環節中,數據抽取直接面對各種分散、異構的數據源,如何保證穩定高效的從這些數據源中提取正確的數據,是ETL設計和實施過程中需要考慮的關鍵問題之一。

在集成端進行數據的初始化時,一般需要將數據源端的全部數據裝載進來,這時需要進行全量抽取。全量抽取類似於數據遷移或數據復制,它將數據源中的表或視圖的數據全部從數據庫中抽取出來,再進行后續的轉換和加載操作。全量抽取可以使用數據復制、導入或者備份的方式完成,實現機制比較簡單。全量抽取完成后,后續的抽取操作只需抽取自上次抽取以來表中新增或修改的數據,這就是增量抽取。

在數據庫倉庫中,無論是全量抽取還是增量抽取,抽取工作一般由數據倉庫工具來完成,如oracle的OWB,Sql Server的Integration Services以及專業的ETL商業產品Informatica PowvrCenter等。如果企業的預算有限,也可以考慮使用開源項目Pentaho。這些工具都有一個特點,就是本身並沒有實現特定的增量抽取機制,它們完成全量抽取后,用戶可以通過定制計划任務的方式,實現按一定的周期從源系統中抽取當前周期內產生的增量數據,但至於這些增量數據如何產生,工具並沒有提供自動生成增量數據的功能。所以,ETL過程中增量數據的產生機制是一個需要用戶重點研究和選擇的問題。

2 增量抽取機制

要實現增量抽取,關鍵是如何准確快速的捕獲變化的數據。優秀的增量抽取機制要求ETL能夠將業務系統中的變化數據按一定的頻率准確地捕獲到,同時不能對業務系統造成太大的壓力,影響現有業務。相對全量抽取而言,增量抽取的設計更復雜,有一種將全量抽取過程自動轉換為增量抽取過程的ETL設計思路,前提是必須捕獲變化的數據,增量數據抽取中常用的捕獲變化數據的方法有以下幾種:

2.1 觸發器方式

觸發器方式是普遍采取的一種增量抽取機制。該方式是根據抽取要求,在要被抽取的源表上建立插入、修改、刪除3個觸發器,每當源表中的數據發生變化,就被相應的觸發器將變化的數據寫入一個增量日志表,ETL的增量抽取則是從增量日志表中而不是直接在源表中抽取數據,同時增量日志表中抽取過的數據要及時被標記或刪除。

為了簡單起見,增量日志表一般不存儲增量數據的所有字段信息,而只是存儲源表名稱、更新的關鍵字值和更新操作類型(insert、update或delete),ETL增量抽取進程首先根據源表名稱和更新的關鍵字值,從源表中提取對應的完整記錄,再根據更新操作類型,對目標表進行相應的處理。

例如,對於源表為Oracle類型的數據庫,采用觸發器方式進行增量數據捕獲的過程如下:

(1)創建增量日志表DML LOG:

create table DML_LOG(

ID NUMBER primary key,--自增主鍵

TABLE_NAME VARCHAR2(200),--源表名稱

RECORD_ID NUMBER,--源表增量記錄的主鍵值

DML_TYPE CHAR(1),--增量類型,I表示新增;U表示更新;D表示刪除

EXECUTE DATE DATE --發生時間

);

(2)為DML_LOG創建一個序列SEQ_DML_LOG,以便觸發器寫增量日志表時生成ID值。

(3)針對要監聽的每一張表,創建一個觸發器,例如對表Test創建觸發器如下:

Create or replace trigger T BEFORE INSERT OR UPDATE OR DELETE ON T for each row

declare I_dml_type varchar2(1);

begin

if INSERTING then l_dml type:=’I’;

elsif UPDATING then I_dml_type:=’U’;

elsif DELETING then l_dml_type:=’D’;

end if;

if DELETING then

insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)

values(seq_dml_log.nextval,’Test’,:old.ID,sysdate,l_dml_type);

else

insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)

values(seq_dml_log.nextval,’Test’,:new.ID,sysdate,l_dml_type);

end if;

end;

這樣,對表T的所有DML操作就記錄在增量日志表DML_LOG中,注意增量日志表中並沒有完全記錄增量數據本身,只是記錄了增量數據的來源。進行增量ETL時,只需要根據增量日志表中的記錄情況,反查源表得到真正的增量數據。

2.2 時間戳方式

時間戳方式是指增量抽取時,抽取進程通過比較系統時間與抽取源表的時間戳字段的值來決定抽取哪些數據。這種方式需要在源表上增加一個時間戳字段,系統中更新修改表數據的時候,同時修改時間戳字段的值。

有的數據庫(例如Sql Server)的時間戳支持自動更新,即表的其它字段的數據發生改變時,時間戳字段的值會被自動更新為記錄改變的時刻。在這種情況下,進行ETL實施時就只需要在源表加上時間戳字段就可以了。對於不支持時間戳自動更新的數據庫,這就要求業務系統在更新業務數據時,通過編程的方式手工更新時間戳字段。

使用時間戳方式可以正常捕獲源表的插入和更新操作,但對於刪除操作則無能為力,需要結合其它機制才能完成。

2.3 全表刪除插入方式

全表刪除插入方式是指每次抽取前先刪除目標表數據,抽取時全新加載數據。該方式實際上將增量抽取等同於全量抽取。對於數據量不大,全量抽取的時間代價小於執行增量抽取的算法和條件代價時,可以采用該方式。

2.4 全表比對方式

全表比對即在增量抽取時,ETL進程逐條比較源表和目標表的記錄,將新增和修改的記錄讀取出來。

優化之后的全部比對方式是采用MD5校驗碼,需要事先為要抽取的表建立一個結構類似的MD5臨時表,該臨時表記錄源表的主鍵值以及根據源表所有字段的數據計算出來的MD5校驗碼,每次進行數據抽取時,對源表和MD5臨時表進行MD5校驗碼的比對,如有不同,進行update操作:如目標表沒有存在該主鍵值,表示該記錄還沒有,則進行insert操作。然后,還需要對在源表中已不存在而目標表仍保留的主鍵值,執行delete操作。

2.5 日志表方式

對於建立了業務系統的生產數據庫,可以在數據庫中創建業務日志表,當特定需要監控的業務數據發生變化時,由相應的業務系統程序模塊來更新維護日志表內容。增量抽取時,通過讀日志表數據決定加載哪些數據及如何加載。日志表的維護需要由業務系統程序用代碼來完成。

2.6 系統日志分析方式

該方式通過分析數據庫自身的日志來判斷變化的數據。關系犁數據庫系統都會將所有的DML操作存儲在日志文件中,以實現數據庫的備份和還原功能。ETL增量抽取進程通過對數據庫的日志進行分析,提取對相關源表在特定時間后發生的DML操作信息,就可以得知自上次抽取時刻以來該表的數據變化情況,從而指導增量抽取動作。

有些數據庫系統提供了訪問日志的專用的程序包(例如Oracle的LogMiner),使數據庫日志的分析工作得到大大簡化。

2.7 特定數據庫的方式

針對特有數據庫系統的增量抽取方式:

2.7.1 Oracle改變數據捕獲(changed data capture,CDC)方式

OracleCDC特性是在Oraele9i數據庫中引入的。CDC能夠幫助識別從上次抽取之后發生變化的數據。利用CDC,在對源表進行insert、update或delete等操作的同時就可以提取數據,並且變化的數據被保存在數據庫的變化表中。這樣就可以捕獲發生變化的數據,然后利用數據庫視圖以一種可控的方式提供給ETL抽取進程,作為增量抽取的依據。

CDC方式對源表數據變化情況的捕獲有兩種方式:同步CDC和異步CDC。同步CDC使用源數據庫觸發器來捕獲變更的數據。這種方式是實時的,沒有任何延遲。當DML操作提交后,變更表中就產生了變更數據。異步CDC使用數據庫重做日志(redolog)文件,在源數據庫發生變更以后,才進行數據捕獲。

2.7.2 Oracle閃回查詢方式

Oracle9i以上版本的數據庫系統提供了閃回查詢機制,允許用戶查詢過去某個時刻的數據庫狀態。這樣,抽取進程可以將源數據庫的當前狀態和上次抽取時刻的狀態進行對比,快速得出源表數據記錄的變化情況。

3 比較和分析

可見,ETL在進行增量抽取操作時,有以上各種機制可以選擇。現從兼容性、完備性、性能和侵入性4個方面對這些機制的優劣進行比較分析。

兼容性

數據抽取需要面對的源系統,並不一定都是關系型數據庫系統。某個ETL過程需要從若干年前的遺留系統中抽取Excel或者CSV文本數據的情形是經常發牛的。這時,所有基於關系型數據庫產品的增量機制都無法工作,時間戳方式和全表比對方式可能有一定的利用價值,在最壞的情況下,只有放棄增量抽取的思路,轉而采用全表刪除插入方式。

完備性

完備性方面,時間戳方式不能捕獲delete操作,需要結合其它方式一起使用。

性能

增量抽取的性能因素表現在兩個方面,一是抽取進程本身的性能,二是對源系統性能的負面影響。觸發器方式、日志表方式以及系統日志分析方式由於不需要在抽取過程中執行比對步驟,所以增量抽取的性能較佳。全表比對方式需要經過復雜的比對過程才能識別出更改的記錄,抽取性能最差。在對源系統的性能影響方面,觸發器方式由於是直接在源系統業務表上建立觸發器,同時寫臨時表,對於頻繁操作的業務系統可能會有一定的性能損失,尤其是當業務表上執行批量操作時,行級觸發器將會對性能產生嚴重的影響;同步CDC方式內部采用觸發器的方式實現,也同樣存在性能影響的問題;全表比對方式和日志表方式對數據源系統數據庫的性能沒有任何影響,只是它們需要業務系統進行額外的運算和數據庫操作,會有少許的時間損耗;時間戳方式、系統日志分析方式以及基於系統日志分析的方式(異步CDC和閃回查詢)對數據庫性能的影響也是非常小的。

侵入性

對數據源系統的侵入性是指業務系統是否要為實現增量抽取機制做功能修改和額外操作,在這一點上,時間戳方式值得特別關注。該方式除了要修改數據源系統表結構外,對於不支持時間戳字段自動更新的關系型數據庫產品,還必須要修改業務系統的功能,讓它在源表t執行每次操作時都要顯式的更新表的時間戳字段,這在ETL實施過程中必須得到數據源系統高度的配合才能達到,並且在多數情況下這種要求在數據源系統看來是比較“過分”的,這也是時間戳方式無法得到廣泛運用的主要原因。另外,觸發器方式需要在源表上建立觸發器,這種在某些場合中也遭到拒絕。還有一些需要建立臨時表的方式,例如全表比對和日志表方式。可能因為開放給ETL進程的數據庫權限的限制而無法實施。同樣的情況也可能發生在基於系統日志分析的方式上,因為大多數的數據庫產品只允許特定組的用戶甚至只有DBA才能執行日志分析。閃回杏詢在侵入性方面的影響是最小的。

綜述:

通過對各種增量抽取機制的對比分析,我們發現,沒有一種機制具有絕對的優勢,不同機制在各種因素的表現大體上都是相對平衡的。兼容性較差的機制,像CDC和閃回查詢機制,由於充分利用了數據源系統DBMS的特性,相對來說具有較好的整體優勢;最容易實現以及兼容性最佳的全表刪除插入機制,則是以犧牲抽取性能為代價的;系統日志分析方式對源業務系統的功能無需作任何改變,對源系統表也無需建立觸發器,而抽取性能也不錯,但有可能需要源系統開放DBA權限給ETL抽取進程,並且自行分析日志系統難度較高,不同數據庫系統的日志格式不一致,這就在一定程度上限制了它的使用范圍。所以,ETL實施過程中究競選擇哪種增量抽取機制,要根據實際的數據源系統環境進行決策,需要綜合考慮源系統數據庫的類型、抽取的數據量(決定對性能要求的苛刻程度)、對源業務系統和數據庫的控制能力以及實現難度等各種因素,甚至結合各種不同的增量機制以針對環境不同的數據源系統進行ETL實施。

4 結束語

為了實現數據倉庫數據的高效更新,增量抽取是ETL數據抽取過程中非常重要的一環,其實現機制直接決定了ETL的整體實施效果。我們通過對幾種常見的增量抽取機制進行了對比,總結了各種機制的特性並分析了它們的優劣。各種增量抽取機制都有它有存在的價值和固有的限制條件,在ETL的設計和實施工作過程中,只能依據項目的實際環境進行綜合考慮,甚至需要對可采用的多種機制進行實際的測試,才能確定一個最優的增量抽取方法。

轉自:sina


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM