1 etl基本概念
1.1 etl的定義 etl分别是“extract”、“ transform” 、“load”三個單詞的首字母縮寫也就是“抽取”、“轉換”、“裝載” ,但我們日常往往簡稱其為資料抽取。etl是bi/dw(商務智能/資料倉庫)的 核心和靈魂,按照統一的規則內建并提高資料的價值,是負責完成資料從資料源向目标資料倉庫轉化的過程,是實施資料倉庫的重要步驟。etl包含了三方面,首 先是“抽取”:将資料從各種原始的業務系統中讀取出來,這是所有工作的前提。其次“轉換”:按照預先設計好的規則将抽取得資料進行轉換,使本來異構的資料 格式能統一起來。最後“裝載”:将轉換完的資料按計劃增量或全部導入到資料倉庫中。
一直想在手工etl的同時自己做一個簡單的中繼資料管理庫。到網上搜尋了一下,有前輩說可以參考開源項目kettle的源代碼,于是就到網上下了一個用了一下,發現過程比較簡潔,而且在很多地方都做得比較人性化,比如支援自己編寫sql、java script等。是以特地打算研究一下,發現網上已經有很多教程了,轉一篇過來看看。改天有時間再研究一下背景的代碼。不過對于中繼資料的記錄資訊似乎少了點,不過鑒于它是完全免費使用的,也沒什麼可說的了。下面是轉載文:
----------------------------
說到etl開源項目,kettle當屬翹首,是以,偶決定花點時間了解一下。項目名稱很有意思,水壺。按項目負責人matt的說法:把各種資料放到一個壺裡,然後呢,以一種你希望的格式流出。呵呵,外國人都很有聯想力。看了提供的文檔,然後對釋出程式的簡單試用後,可以很清楚得看到kettle的四大塊:
chef——工作(job)設計工具 (gui方式)
kitchen——工作(job)執行器 (指令行方式)
spoon——轉換(transform)設計工具(gui方式)
span——轉換(trasform)執行器(指令行方式)
嗯,廚師已經在廚房裡,勺子和盤子一應俱全,且看能做出如何的大餐?
一:chef——工作(job)設計器
這是一個gui工具,操作方式主要通過拖拖拉拉,勿庸多言,一看就會。何謂工作?多個作業項,按特定的工作流串聯起來,開成一項工作。正如:我的工作是軟體開發。我的作業項是:設計、編碼、測試!先設計,如果成功,則編碼,否則繼續設計,編碼完成則開始設計,周而複始,作業完成。來,看看chef中的作業項:
1.1: 轉換:指定更細的轉換任務,通過spoon生成。通過field來輸入參數。
1.2: sql:sql語句執行,
1.3: ftp:下載下傳ftp檔案。
1.4: 郵件:發送郵件。
1.5: 檢查表是否存在,
1.6: 檢查檔案是否存在,
1.7: 執行shell腳本。如:dos指令。
1.8: 批處理。(注意:windows批處理不能有輸出到控制台)。
1.9: job包。作為嵌套作業使用。
1.10:javascript執行。這個比較有意思,我看了一下源碼,如果你有自已的script引擎,可以很友善的替換成自定義script,來擴充其功能。
1.11:sftp:安全的ftp協定傳輸。
1.12:http方式的上/下傳。
好了,看看工作流:
如上文所述,工作流是作業項的連接配接方式。分為三種:無條件,成功,失敗。這個沒啥好說的,從名字就能知道它的意圖。嗯,為了友善工作流使用,提供了幾個輔助結點單元(你也可将其作為簡單的作業項):
1:start單元,任務必須由此開始。設計作業時,以此為起點。
2:ok單元:可以編制做為中間任務單元,且進行腳本編制,用來控制流程。
3:error單元:用途同上。
4:dummy單元:啥都不做,主要是用來支援多分支的情況。文檔中有例子,不再多說。
存儲方式:
支援xml存儲,或存儲到指定資料庫中。一些預設的配置(如資料庫存儲位置……),在系統的使用者目錄下,單獨建立了一個.kettle目錄,用來儲存使用者的這些設定。
logview:可檢視執行日志。
二:kitchen——作業執行器
是一個作業執行引擎,用來執行作業。這是一個指令行執行工具,沒啥可講的,就把它的參數說明列一下。
-rep : repository name 任務包所在存儲名
-user : repository username 執行人
-pass : repository password 執行人密碼
-job : the name of the job to launch 任務包名稱
-dir : the directory (don''t forget the leading / or \)
-file : the filename (job xml) to launch
-level : the logging level (basic, detailed, debug, rowlevel, error, nothing) 指定日志級别
-log : the logging file to write to 指定日志檔案
-listdir : list the directories in the repository 列出指定存儲中的目錄結構。
-listjobs : list the jobs in the specified directory 列出指定目錄下的所有任務
-listrep : list the defined repositories 列出所有的存儲
-norep : don''t log into the repository 不寫日志
嗯,居然不支援排程。看了一下文檔,建議使用作業系統提供的排程器來實作排程,比如:windows可以使用它的任務計劃工具。
三:spoon——轉換過程設計器
gui工作,用來設計資料轉換過程,建立的轉換可以由pan來執行,也可以被chef所包含,作為作業中的一個作業項。下面簡單列舉一下所有的轉換過程。(簡單描述,詳細的可見spoon文檔)
3.1:input-steps:輸入步驟
3.1.1:text file input:文本檔案輸入,
可以支援多檔案合并,有不少參數,基本一看參數名就能明白其意圖。
3.1.2:table input:資料表輸入
實際上是視圖方式輸入,因為輸入的是sql語句。當然,需要指定資料源(資料源的定制方式在後面講一下)
3.1.3:get system info:取系統資訊
就是取一些固定的系統環境值,如本月最後一天的時間,本機的ip位址之類。
3.1.4:generate rows:生成多行。
這個需要比對使用,主要用于生成多行的資料輸入,比如配合add sequence可以生成一個指定序号的資料列。
3.1.5:xbase input:
3.1.6:excel input:
3.1.7:xml input:
這三個沒啥可講的,看看參數就明了。
3.2:output-steps: 輸出步聚
3.2.1:text file output:文本檔案輸出。
這個用來作測試蠻好,呵呵。很友善的看到轉換的輸出。
3.2.2:table output:輸出到目的表。
3.2.3:insert/update:目的表和輸入資料行進行比較,然後有選擇的執行增加,更新操作。
3.2.4:update:同上,隻是不支援增加操作。
3.2.5:xml output:
3.3:look-up:查找操作
database:
stream:
procedure:
database join:
很簡單,看看參數就明白了。
3.4:transform 轉換 (嗯,重點)
3.4.1:select values: 對輸入的行記錄資料 的字段進行更改 (更改資料類型,更改字段名或删除)
資料類型變更時,資料的轉換有固定規則,可簡單定制參數。可用來進行資料表的改裝。
3.4.2:filter rows: 對輸入的行記錄進行 指定複雜條件 的過濾。
用途可擴充sql語句現有的過濾功能。但現有提供邏輯功能超出标準sql的不多。
3.4.3:sort rows:對指定的列以升序或降序排序,當排序的行數超過5000時需要臨時表。
3.4.4:add sequence:為資料流增加一個序列,
這個配合其它step(generate rows, rows join),可以生成序清單,如日期次元表(年、月、日)。
3.4.5:dummy:不做任何處理,主要用來作為分支節點。
3.4.6:join rows:對所有輸入流做笛卡兒乘積。
3.4.7:aggregate:聚合,分組處理
3.4.8:group by:分組
用途可擴充sql語句現有的分組,聚合函數。但我想可能會有其它方式的sql語句能實作。
3.4.9:java script value:使用mozilla的rhino作為腳本語言,并提供了很多函數,使用者可以在腳本中使用這些函數。
3.4.10: row normaliser:該步驟可以從透視表中還原資料到事實表,
通過指定次元字段及其分類值,度量字段,最終還原出事實表資料。
3.4.11. unique rows:去掉輸入流中的重複行
在使用該節點前要先排序,否則隻能删除連續的重複行。
3.4.12. calculator:提供了一組函數對列值進行運算,
所介紹,使用該方式比使用者自定義java script腳本速度更快。
3.4.13. merge rows:用于比較兩組輸入資料,一般用于更新後的資料重新導入到資料倉庫中。
3.4.14. add constants:增加常量值。
這個我沒弄明白它的用法???
3.4.15. row denormaliser:同normaliser過程相反。
3.4.16. row flattener:表扁平化處理
指定需處理的字段和扃平化後的新字段,将其它字段做為組合key進行扃平化處理。
3.5:extra:除了上述基本節點類型外還定義了擴充節點類型
3.5.1:split fields, 按指定分隔符拆分字段
3.5.2:execute sql script,執行sql語句
3.5.3:cube input,
3.5.4:cube output等。
這兩個沒明白是啥意思。
3.6:其它
存儲方式: 與chef相同。
資料源(connection);見後。
hops:setp連接配接起來,形成hops。
plugin step types等節點:這個沒仔細看,不知如何制作plugin step。
logview:可檢視執行日志。
四:pan——轉換的執行工具
指令行執行方式,可以執行由spoon生成的轉換任務。
同樣,不支援排程。
參數與kitchen類似,可參見pan的文檔。
五:其它
connection:
可以配置多個資料源,在job或是trans中使用,這意味着可以實作跨資料庫的任務。
支援大多數市面上流行的資料庫。
個人感覺:(本人不成熟的看法)
1:轉換功能全,使用簡潔。作業項豐富,流程合理。但缺少排程。
2:java代碼,支援的資料源範圍廣,是以,跨平台性較好。
3:從實際項目的角度看,和其它開源項目類似,主要還是程式員的思維,缺少與實際應用項目(專業領域)的更多接軌,當然,項目實施者的專注點可能在于一個平台架構,而非實際應用(實際應用需要二次開發)。
4:看過了大多數源碼,發現源碼的可重用性不是太好(缺少大粒度封裝),有些關鍵部分好象有bug。比如:個别class過于臃腫,線程實作的同步有問題。
5:提供的工具有些小錯,如參數的容錯處理。
好,對kettle有了淺淺的了解,其它的容後再說。