一、基本概念
ETL,它是Extract、Transform、Load三個單詞的首寫字母。ETL是建立數據倉庫最重要的處理過程,也是工作量最大的環節,一般會占到整個數據倉庫建立的一半工作量。
- 抽取:從操作型數據源獲取數據;
- 轉換:轉換數據,使之轉變為適用於查詢和分析的形式和結構;
- 裝載:將轉換后的數據導入到最終的目標數據倉庫;
建立一個數據倉庫,就是要把來自多個異構的源系統的數據集成在一起,然后放置於一個集中的位置,用於數據分析。
二、E:抽取
典型的源系統一般是事務處理應用,可能是一個銷售分析數據倉庫的源系統之一,又可能是一個訂單錄入系統,其中包括了訂單的相關操作的全部行為記錄。這些記錄很多,很復雜,確定需要抽取的數據(目標數據)非常困難。通常數據都不是只抽取一次,而是需要一定的時間間隔反復抽取,通過這樣的方式把數據的所有變化提供給數據倉庫,保持數據的及時性。假設已經明確抽取的目標數據,就可以考慮使用哪種抽取方法。
抽取方法的選擇高度依賴於源系統和目標數倉環境的業務需求。一般遵循兩大原則:一、不可在源系統添加額外的邏輯;二、不能增加源系統的工作負載。即不可以對源系統具有侵入性。下面介紹抽取的兩大方法:邏輯抽取和物理抽取。
1、邏輯抽取
邏輯抽取分為:全量抽取和增量抽取。
1.1 全量抽取
全量,即將源系統的全部數據都抽取過來。這種抽取方式有一種好處,就是不需要跟蹤自上次成功抽取以來的數據變化,不需要給源系統數據附加邏輯信息(譬如時間戳)。一般情況下,第一次抽取會采用全量抽取。
1.2 增量抽取
增量,只抽取某個事件發生的特定時間點之后的數據,即某個時間點變化的數據。往往源系統的數據量是非常龐大的,譬如一些c端的行為信息,那么采用全量抽取,會使得抽取的效率很慢,所以增量抽取是一種很好的手段。使用增量抽取,必須能夠標識出特定時間點之后所有的數據變化,因為數據由源系統提供,那么常用的可以是在抽取邏輯上將時間戳提取出來,作為標識。增量抽取的技術,也常被稱作“變化數據獲取”,簡稱“CDC”。常用的有四種手段:時間戳、快照、觸發器和日志。
- 時間戳:需要源系統有相應的時間數據列標識;
- 快照:可以使用OLTP數據庫系統自帶的機制實現,也可以自定義實現;
- 觸發器:觸發器是關系型數據庫的特性;
- 日志:可以使用應用日志或者系統日志,這種方式對源系統不具有侵入性,但需要額外的日志解析工作;
在很多數據倉庫中,抽取過程並不含有任何變化數據捕獲技術,其增量抽取的過程是這樣的:把源系統中的整個表抽取到數據倉庫過渡區,然后用這個表的數據和上次從源系統抽取的表數據做對比,從而得到變化的數據。當然,這種做法會給數倉處理增加負擔,特別是數據量特別大的時候。
2、物理抽取
依賴於選擇的邏輯抽取方法,以及能夠對源系統所做的操作和所受的限制,可以有兩種物理抽取機制:聯機抽取和脫機抽取。
2.1 聯機抽取
數據直接從源系統抽取。
2.2 脫機抽取
數據不從源系統直接抽取,而是從一個源系統以外的過渡區抽取。過渡區可以是已經存在(如數據庫備份文件、重做日志或者歸檔日志),也可以是抽取程序自己建立。
三、T:轉換
數據從操作型源系統獲取之后,需要多種轉換操作,如統一數據類型、處理拼寫錯誤、消除數據歧義、解析為標准格式等。數據轉換一個重要的功能是數據清洗,目的是只有“合規”的數據才能進入目標數據倉庫。轉換操作是ETL最復雜,最繁瑣的環節,占據整個ETL50%時間,由於篇幅有限,這里不詳細說明。
四、L:加載
ETL的最后步驟是把轉換后的數據裝載進目標數據倉庫,需要關注的兩個問題:
1、數據的裝載效率
要提高裝載的效率,可以從下面幾個方面入手:
- 保證足夠的系統資源;
- 海量數據情況下,服務器具備高性能,資源獨占,即不與其他系統共用;
- 禁用數據庫約束(唯一性、非空性,檢查約束等),裝載結束,再啟動這些約束;
- 不使用外鍵約束;
2、一旦裝載中途失敗,如何再次重復執行裝載過程
需要再次執行裝載過程,一般有兩種情況。
一種情況是,數據裝載過程中,可能由於各種原因而失敗,比如源表與目標表的結構不一致,而這時已經有部分表裝載成功。那么,在大數據情況下,如何只裝載失敗的部分數據,是一個不小的挑戰。這種情況下,解決方案是記錄失敗點,並在裝載程序中處理相關邏輯。
另一種情況是,裝載成功后,某些數據滯后了,會帶來數據的更新或新增,對於這種情況,是先刪除再插入,或者使用replace into、merge into等類似功能的操作。
(附上一張簡單的關系圖)