1. 程式人生 > >Kettle進行數據遷移(ETL)

Kettle進行數據遷移(ETL)

遷移數據 rom 原因分析 pre jdb 總結 界面 shift regex

 由於開發新的系統,需要將之前一個老的C/S應用的數據按照新的數據設計導入到新庫中。此過程可能涉及到表結構不一致、大數據量(千萬級,甚至上億)等情況,包括異構數據的抽取、清洗等等工作。部分復雜的工作需要我們的DBA寫代碼用程序在JDBC或者Delphi中解決,而大部分稍簡單的數據的遷移需要一個強大的ETL工具來解決。某日,技術經理讓我找一個滿足我們項目數據遷移需求的穩定、高效ETL工具。google了幾把,網上大致有下列幾款軟件資料較多:Oracle的OWB(Oracle Warehouse Builder)、AICloudETL、Kettle等等。一一安裝並嘗試,最終因為Kettle資料豐富、成功案例多、可配合強大的任務調度工具來使用而選定用它。經過測試效率基本滿足遷移需要。在2012年7月左右的時候寫了一個簡單的入門文檔供項目組內部使用,現在貼出來,供有類似需求的朋友們參考。【之後我們還用Flex+Quartz開發了一個BS的類似於Kettle的數據轉移工具,在我們的項目中每天晚上從一個庫遷移數據到另一個庫。將在之後的博文中大體講述】
 

一 關於Kettle

Kettle是一款國外開源的ETL工具,純java編寫,數據抽取高效穩定的數據遷移工具。Kettle中有兩種腳本文件,transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工作流程的控制。

二 本項目中的ETL需求

本項目主要有以下要求:

1、能完成ASCii編碼到UTF8編碼的轉換。

2、穩定。

3、可高效的完成批量數據的轉移。

4、能記錄、查看(最好能給出分析)轉移過程中失敗的數據。

5、易於使用,學習成本低。

經測試,以上需求Kettle均可滿足,將在之後的操作說明中提及並在最後總結。

三 操作說明

3.1軟件獲取

在官網http://kettle.pentaho.com/下載,該軟件為綠色版,解壓後點擊Spoon.bat運行,需要JRE環境支持。(此文檔中使用4.2.0 stable版本示例)

3.2 基本操作

Kettle左側的功能區有“主對象樹”和“核心對象”兩個面板。其中“核心對象”較為常用。右側為對象的屬性編輯區。可以將左側的對象拖動到右側編輯區。同時按鍵盤shift鍵在兩個對象上畫線,可連接兩個對象。多個對象連接成為一個transformation。

3.3 示例一:Kettle的基本操作和簡單應用

場景要求:此demo假設需抽取***.**.**.33上編碼為US7ASCII的某一張表中數據提取到本地上編碼為UTF-8的庫中。

詳細步驟:

1、雙擊Spoon.bat運行軟件,點擊“沒有資源庫”,進入主界面。左上角點擊”文件-新建-轉換“保存為demo.ktr

2、左側選擇“核心對象”面板。”在“輸入”文件夾下選擇“表輸入”並把它拖動到右側編輯區。

技術分享圖片

3、雙擊編輯區的“表輸入”圖標,編輯數據輸入來源。點擊“數據庫連接”右側的“新建”按鈕,按demo背景中的要求,配置數據庫參數。配置後點擊“Test”,若配置有誤將彈出異常提示,根據提示修正。若無誤將顯示如下信息:

技術分享圖片

點擊“確定”和“OK”,我們為此表輸入對象確定了數據庫。

4、繼續點擊“獲取SQL”查詢語句,選擇輸入表。這裏我們選擇A_GB這張表。

技術分享圖片

選擇輸入表後,請務必勾選“允許延遲加載”復選框。(否則可能導致亂碼,將在文檔最後說明。)其余選項默認,點擊“確定”完成表輸入對象的編輯。

5、在左側“核心對象”中的“轉換”文件夾中選擇“字段選擇”功能,拖動到右側編輯區。按住鍵盤shift同時鼠標從“表輸入”為起點,“字段選擇”為終點畫一條連接。如圖:

技術分享圖片

6、雙擊“字段選擇”,打開編輯窗口,選擇“元數據”面板,點擊右側“獲取改變的字段”,將自動列出之前表輸入中所有字段。

7、根據要抽取的目標表字段名(輸出字段名),給每一個輸入字段改成和輸出字段相同的名稱。同時請務必在Encoding一欄中選擇輸出庫的編碼。根據demo的背景要求,此處我們選擇GBK。

技術分享圖片

8、編輯完“字段選擇”後點擊“確定”關閉窗口。同上,在“輸出”文件夾中拖動一個“表輸出”到右側編輯區,並畫連接。

技術分享圖片

9、雙擊“表輸出”打開其編輯窗口。同“表輸入”一樣,按照demo背景要求,配置好本地庫。

技術分享圖片

10、同“表輸入”,選擇輸出的目標表。選擇後在“Darabase fileds”面板中點擊“Enter field mapping”映射輸入輸出關系。

技術分享圖片

11、因之前已經在“字段選擇”中為每一個輸入字段改名,這裏點“猜一猜”,會根據字段近似度自動匹配映射關系。

技術分享圖片

映射完輸入輸出字段的關系,檢查無誤後,點擊“確定”關閉窗口。

12、至此,我們最簡單的一個抽取示例的轉換建立完畢,點擊“校驗這個轉換”,Kettle會校驗並給出簡單的報告。此處只有一個警告,經檢查並不影響我們的抽取轉換工作,點擊“關閉”。

技術分享圖片

13、點擊“運行這個轉換”,選擇“本地執行”,點擊“啟動”來執行這個轉換。

技術分享圖片

14、轉換的過程可以在控制臺實時顯示。同時“日誌”的詳細程度是可選的。

技術分享圖片

15、執行完畢後,控制臺日誌若無異常信息,說明轉換成功,可以去我們本地庫查看。發現確實已被導入新庫,兩者記錄數相同且無亂碼。

3.4示例二:字段合並、計算等復雜背景下的應用

場景要求:要求數據輸入來自於兩張表,且輸出表的某字段需兩張輸入表的字段進行合並。並可能對某些字段進行字符串操作、日期運算、數學計算等。此示例演示字符串操作、列合並。日期運算和數學計算與此類似,不再敖述。

簡略步驟:

1、基本操作同示例一,其中需引入“Replace in string”和“Modified JavaScript Value”對象。

技術分享圖片

2、表輸入:使用一個簡單的關連查詢,查出所有要抽取的字段和需要合並的列。

技術分享圖片

3、Replace in string對象:需填寫要被替換的輸入字段“In Stream field”,這裏我們替換APP_CN_NAME字段。是否使用正則表達式“useRegEx”選擇“否”,“Search”搜索字符串假設搜索“PERFETTI VAN”,“Replace with”替換為“Replace in string替換後的內容”。“Whole word”是否整個單詞和“Case sensitive”大小寫敏感均選擇“否”。

技術分享圖片

4、“Modified JavaScript Value”對象:此對象通過編寫javaScript腳本來對記錄進行高級操作。Kettle內置mozilla的rhino來運行腳本,完成對輸入記錄的一系列操作。

技術分享圖片

左側有大量的字符串、日期、數學運算的庫函數可以調用。這裏只簡單將兩列合並為新字段。(若數學、日期運算較復雜,也可以使用“計算器”對象)

此demo中Javascript對象中的值為:

四 Kettle針對此項目的註意事項

4.1 編碼問題

項目要求能完成ASCii編碼到UTF8編碼的轉換。資料顯示Kettle默認輸入、輸出均使用UTF-8編碼。為保證不亂碼需註意:

輸入:此項目的輸入是ASCii,故在“表輸入”編輯面板務必勾選“允許延遲轉換”,便會根據數據庫自身的編碼讀入。否則將會默認以UTF-8讀入,可能導致亂碼。

輸出:在輸出前請使用“字段選擇”對象。同時在“字段選擇”的“元數據”面板中設置輸出編碼。可以指定任意輸出字符集。

4.2 效率問題

項目要求ETL工具需高效的完成批量數據的轉移。查看日誌發現Kettle每次輸入5W條記錄,經過處理再輸出。經測試,100W條記錄,從172.16.4.33至本地,耗時14min22s。

4.3異常信息

由於Kettle由Java編寫,出錯時,其異常信息也按照Java異常信息格式打印。如圖某錯誤的日誌為:

技術分享圖片

其信息是:

13.11.42 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseBatchException:

2012/07/10 09:42:32 - 表輸出.0 - ERROR (version 4.2.0-stable, build 15748 from 2011-09-08 13.11.42 by buildguy) : Error updating batch

2012/07/10 09:42:32 - 表輸出.0 - ERROR (version 4.2.0-stable, build 15748 from 2011-09-08 13.11.42 by buildguy) : ORA-12899: 列 "SCOTT"."T_TMAAS_APP_TMXZ_APPFORM"."APP_NUM" 的值太大 (實際值: 9, 最大值: 4)

由以上異常信息可明顯看出在批量更新時出錯,錯誤在“表輸出”時出現,具體原因是SCOTT用戶下的T_TMAAS_APP_TMXZ_APPFORM表的APP_NUM字段的輸出值太大。經檢查,該字段最大長度為4,合並後向其輸出的長度為9,故拋此異常。

此信息會對異常有較準確的範圍描述和簡單的原因分析,有利於分析。但未標明是哪一條記錄導致。(由於ETL過程可能有復雜的表關聯和字段處理,產生異常不一定是輸入流中數據的問題,可也能是關聯問題、腳本將字段變換後和輸出不匹配等問題。尤其是關聯後的記錄經腳本處理後與輸出表結構不匹配時,軟件難以定位原始記錄,需人工分析。)

4.4、易用性

Kettle由Java編寫,在生產中可方便地與Java項目整合,配合任務調度工具可完成強大的ETL工作,使用較為廣泛,參考資料豐富。

Kettle進行數據遷移(ETL)