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