由于開發(fā)新的系統(tǒng),需要將之前一個老的C/S應用的數(shù)據(jù)按照新的數(shù)據(jù)設計導入到新庫中。此過程可能涉及到表結(jié)構(gòu)不一致、大數(shù)據(jù)量(千萬級,甚至上億)等情況,包括異構(gòu)數(shù)據(jù)的抽取、清洗等等工作。部分復雜的工作需要我們的DBA寫代碼用程序在JDBC或者Delphi中解決,而大部分稍簡單的數(shù)據(jù)的遷移需要一個強大的ETL工具來解決。某日,技術(shù)經(jīng)理讓我找一個滿足我們項目數(shù)據(jù)遷移需求的穩(wěn)定、高效ETL工具。google了幾把,網(wǎng)上大致有下列幾款軟件資料較多:Oracle的OWB(Oracle Warehouse Builder)、AICloudETL、Kettle等等。一一安裝并嘗試,最終因為Kettle資料豐富、成功案例多、可配合強大的任務調(diào)度工具來使用而選定用它。經(jīng)過測試效率基本滿足遷移需要。在2012年7月左右的時候?qū)懥艘粋€簡單的入門文檔供項目組內(nèi)部使用,現(xiàn)在貼出來,供有類似需求的朋友們參考。【之后我們還用Flex+Quartz開發(fā)了一個BS的類似于Kettle的數(shù)據(jù)轉(zhuǎn)移工具,在我們的項目中每天晚上從一個庫遷移數(shù)據(jù)到另一個庫。將在之后的博文中大體講述】 一 關(guān)于KettleKettle是一款國外開源的ETL工具,純java編寫,數(shù)據(jù)抽取高效穩(wěn)定的數(shù)據(jù)遷移工具。Kettle中有兩種腳本文件,transformation和job,transformation完成針對數(shù)據(jù)的基礎轉(zhuǎn)換,job則完成整個工作流程的控制。 二 本項目中的ETL需求本項目主要有以下要求: 1、能完成ASCii編碼到UTF8編碼的轉(zhuǎn)換。 2、穩(wěn)定。 3、可高效的完成批量數(shù)據(jù)的轉(zhuǎn)移。 4、能記錄、查看(最好能給出分析)轉(zhuǎn)移過程中失敗的數(shù)據(jù)。 5、易于使用,學習成本低。 經(jīng)測試,以上需求Kettle均可滿足,將在之后的操作說明中提及并在最后總結(jié)。 三 操作說明3.1軟件獲取在官網(wǎng)http://kettle./下載,該軟件為綠色版,解壓后點擊Spoon.bat運行,需要JRE環(huán)境支持。(此文檔中使用4.2.0 stable版本示例) 3.2 基本操作Kettle左側(cè)的功能區(qū)有“主對象樹”和“核心對象”兩個面板。其中“核心對象”較為常用。右側(cè)為對象的屬性編輯區(qū)。可以將左側(cè)的對象拖動到右側(cè)編輯區(qū)。同時按鍵盤shift鍵在兩個對象上畫線,可連接兩個對象。多個對象連接成為一個transformation。 3.3 示例一:Kettle的基本操作和簡單應用場景要求:此demo假設需抽取***.**.**.33上編碼為US7ASCII的某一張表中數(shù)據(jù)提取到本地上編碼為UTF-8的庫中。 詳細步驟: 1、雙擊Spoon.bat運行軟件,點擊“沒有資源庫”,進入主界面。左上角點擊”文件-新建-轉(zhuǎn)換“保存為demo.ktr 2、左側(cè)選擇“核心對象”面板?!痹凇拜斎搿蔽募A下選擇“表輸入”并把它拖動到右側(cè)編輯區(qū)。
3、雙擊編輯區(qū)的“表輸入”圖標,編輯數(shù)據(jù)輸入來源。點擊“數(shù)據(jù)庫連接”右側(cè)的“新建”按鈕,按demo背景中的要求,配置數(shù)據(jù)庫參數(shù)。配置后點擊“Test”,若配置有誤將彈出異常提示,根據(jù)提示修正。若無誤將顯示如下信息: 點擊“確定”和“OK”,我們?yōu)榇吮磔斎雽ο蟠_定了數(shù)據(jù)庫。 4、繼續(xù)點擊“獲取SQL”查詢語句,選擇輸入表。這里我們選擇A_GB這張表。
選擇輸入表后,請務必勾選“允許延遲加載”復選框。(否則可能導致亂碼,將在文檔最后說明。)其余選項默認,點擊“確定”完成表輸入對象的編輯。 5、在左側(cè)“核心對象”中的“轉(zhuǎn)換”文件夾中選擇“字段選擇”功能,拖動到右側(cè)編輯區(qū)。按住鍵盤shift同時鼠標從“表輸入”為起點,“字段選擇”為終點畫一條連接。如圖:
6、雙擊“字段選擇”,打開編輯窗口,選擇“元數(shù)據(jù)”面板,點擊右側(cè)“獲取改變的字段”,將自動列出之前表輸入中所有字段。 7、根據(jù)要抽取的目標表字段名(輸出字段名),給每一個輸入字段改成和輸出字段相同的名稱。同時請務必在Encoding一欄中選擇輸出庫的編碼。根據(jù)demo的背景要求,此處我們選擇GBK。
8、編輯完“字段選擇”后點擊“確定”關(guān)閉窗口。同上,在“輸出”文件夾中拖動一個“表輸出”到右側(cè)編輯區(qū),并畫連接。
9、雙擊“表輸出”打開其編輯窗口。同“表輸入”一樣,按照demo背景要求,配置好本地庫。
10、同“表輸入”,選擇輸出的目標表。選擇后在“Darabase fileds”面板中點擊“Enter field mapping”映射輸入輸出關(guān)系。
11、因之前已經(jīng)在“字段選擇”中為每一個輸入字段改名,這里點“猜一猜”,會根據(jù)字段近似度自動匹配映射關(guān)系。
映射完輸入輸出字段的關(guān)系,檢查無誤后,點擊“確定”關(guān)閉窗口。
12、至此,我們最簡單的一個抽取示例的轉(zhuǎn)換建立完畢,點擊“校驗這個轉(zhuǎn)換”,Kettle會校驗并給出簡單的報告。此處只有一個警告,經(jīng)檢查并不影響我們的抽取轉(zhuǎn)換工作,點擊“關(guān)閉”。
13、點擊“運行這個轉(zhuǎn)換”,選擇“本地執(zhí)行”,點擊“啟動”來執(zhí)行這個轉(zhuǎn)換。
14、轉(zhuǎn)換的過程可以在控制臺實時顯示。同時“日志”的詳細程度是可選的。
15、執(zhí)行完畢后,控制臺日志若無異常信息,說明轉(zhuǎn)換成功,可以去我們本地庫查看。發(fā)現(xiàn)確實已被導入新庫,兩者記錄數(shù)相同且無亂碼。 3.4示例二:字段合并、計算等復雜背景下的應用場景要求:要求數(shù)據(jù)輸入來自于兩張表,且輸出表的某字段需兩張輸入表的字段進行合并。并可能對某些字段進行字符串操作、日期運算、數(shù)學計算等。此示例演示字符串操作、列合并。日期運算和數(shù)學計算與此類似,不再敖述。 簡略步驟: 1、基本操作同示例一,其中需引入“Replace in string”和“Modified JavaScript Value”對象。
2、表輸入:使用一個簡單的關(guān)連查詢,查出所有要抽取的字段和需要合并的列。
3、Replace in string對象:需填寫要被替換的輸入字段“In Stream field”,這里我們替換APP_CN_NAME字段。是否使用正則表達式“useRegEx”選擇“否”,“Search”搜索字符串假設搜索“PERFETTI VAN”,“Replace with”替換為“Replace in string替換后的內(nèi)容”?!癢hole word”是否整個單詞和“Case sensitive”大小寫敏感均選擇“否”。
4、“Modified JavaScript Value”對象:此對象通過編寫javaScript腳本來對記錄進行高級操作。Kettle內(nèi)置mozilla的rhino來運行腳本,完成對輸入記錄的一系列操作。
左側(cè)有大量的字符串、日期、數(shù)學運算的庫函數(shù)可以調(diào)用。這里只簡單將兩列合并為新字段。(若數(shù)學、日期運算較復雜,也可以使用“計算器”對象) 此demo中Javascript對象中的值為:
四 Kettle針對此項目的注意事項4.1 編碼問題項目要求能完成ASCii編碼到UTF8編碼的轉(zhuǎn)換。資料顯示Kettle默認輸入、輸出均使用UTF-8編碼。為保證不亂碼需注意: 輸入:此項目的輸入是ASCii,故在“表輸入”編輯面板務必勾選“允許延遲轉(zhuǎn)換”,便會根據(jù)數(shù)據(jù)庫自身的編碼讀入。否則將會默認以UTF-8讀入,可能導致亂碼。
輸出:在輸出前請使用“字段選擇”對象。同時在“字段選擇”的“元數(shù)據(jù)”面板中設置輸出編碼??梢灾付ㄈ我廨敵鲎址?/p>
4.2 效率問題項目要求ETL工具需高效的完成批量數(shù)據(jù)的轉(zhuǎn)移。查看日志發(fā)現(xiàn)Kettle每次輸入5W條記錄,經(jīng)過處理再輸出。經(jīng)測試,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) 由以上異常信息可明顯看出在批量更新時出錯,錯誤在“表輸出”時出現(xiàn),具體原因是SCOTT用戶下的T_TMAAS_APP_TMXZ_APPFORM表的APP_NUM字段的輸出值太大。經(jīng)檢查,該字段最大長度為4,合并后向其輸出的長度為9,故拋此異常。 此信息會對異常有較準確的范圍描述和簡單的原因分析,有利于分析。但未標明是哪一條記錄導致。(由于ETL過程可能有復雜的表關(guān)聯(lián)和字段處理,產(chǎn)生異常不一定是輸入流中數(shù)據(jù)的問題,可也能是關(guān)聯(lián)問題、腳本將字段變換后和輸出不匹配等問題。尤其是關(guān)聯(lián)后的記錄經(jīng)腳本處理后與輸出表結(jié)構(gòu)不匹配時,軟件難以定位原始記錄,需人工分析。) 4.4、易用性Kettle由Java編寫,在生產(chǎn)中可方便地與Java項目整合,配合任務調(diào)度工具可完成強大的ETL工作,使用較為廣泛,參考資料豐富。 |
|