目錄
Kettle是一款流行的ETL(Extract-Transform-Load,即數據抽取、轉換、裝載)工具,並可用來操作Hadoop上的數據。Kettle是用Java語言開發的。它最初的作者Matt Casters原是一名C語言程序員,在着手開發Kettle時還是一名Java小白,但是他僅用了一年時間就開發出了Kettle的第一個版本。雖然有很多不足,但這版畢竟是可用的。使用自己並不熟悉的語言,僅憑一己之力在很短的時間裏就開發出了複雜的ETL系統工具,作者的開發能力和實踐精神令人十分佩服。後來Pentaho公司獲得了Kettle源代碼的版權,Kettle也隨之更名爲Pentaho Data Integration,簡稱PDI。
一、Kettle設計原則
Kettle工具在設計之初就考慮到了一些設計原則,這些原則也借鑑了以前使用過的其它一些ETL工具積累下的經驗和教訓。
- 易於開發
Kettle認爲,作爲ETL的開發者,應該把時間用在創建應用解決方案上。任何用於軟件安裝、配置的時間都是一種浪費。例如,爲了創建數據庫連接,很多和Kettle類似的Java工具都要求用戶手工輸入數據驅動類名和JDBC URL連接串。儘管用戶可以通過互聯網都能搜索到這些信息,但這明顯把用戶的注意力轉移到了技術方面而非業務方面。Kettle儘量避免這類問題的發生。
- 避免自定義開發
一般來說,ETL工具要使簡單的事情更簡單,使複雜的事情成爲可能。ETL工具提供了標準化的構建組件來實現ETL開發人員不斷重複的需求。當然可以通過手工編寫Java代碼或Java腳本來實現一些功能,但增加的每一行代碼都給項目增加了複雜度和維護成本。所以Kettle儘量避免手工開發,儘量提供組件及其各種組合來完成任務。
- 所有功能都通過用戶界面完成
Kettle直接把所有功能通過界面的方式提供給用戶,節約開發人員或用戶的時間。當然專家級的ETL用戶還是要去學習隱藏在界面後的一些特性。在Kettle裏,ETL元數據可以通過XML格式表現,或通過資源庫,或通過使用Java API。無論ETL元數據以哪種形式提供,都可以百分之百通過圖形用戶界面來編輯。
- 沒有命名限制
ETL轉換裏有各種各樣的名稱,如數據庫連接、轉換、步驟、數據字段、作業等都要有一個名稱。如果還要在命名時考慮一些限制(如長度、選擇的字符等),就會給工作帶來一定麻煩。Kettle具備足夠的智能化來處理ETL開發人員設置的各種名稱。最終ETL解決方案應該可以儘可能地自描述,這樣可以部分減少文檔的需求,減少項目維護成本。
- 透明
Kettle不需要用戶瞭解轉換中某一部分工作是如何完成的,但允許用戶看到ETL過程中各部分的運行狀態。這樣可以加快開發速度、降低維護成本。
- 靈活的數據通道
Kettle從設計初始就在數據的發送、接收方式上儘可能靈活。Kettle可以在文本文件、關係數據庫等不同目標之間複製和分發數據,從不同數據源合併數據也是內核引擎的一部分,也同樣很簡單。
- 只映射需要映射的字段
在一些ETL工具裏經常可以看到數百行的輸入和輸出映射,對於維護人員來說這是一個噩夢。在ETL開發過程中,字段要經常變動,這樣的大量映射也會增加維護成本。Kettle的一個重要核心原則就是,在ETL流程中所有未指定的字段都自動被傳遞到下一個組件。也就是說輸入中的字段會自動出現在輸出中,除非中間過程特別設置了終止某個字段的傳遞。
- 可視化編程
Kettle可以被歸類爲可視化編程語言(Visual Programming Languages,VPL),因爲Kettle可以使用圖形化的方式定義複雜的ETL程序和工作流。Kettle裏的圖就是轉換和作業。可視化編程一直是Kettle裏的核心概念,它可以讓用戶快速構建複雜的ETL作業和降低維護工作量。Kettle中的設計開發工作幾乎都可以通過簡單的拖拽來完成。它通過隱藏很多技術細節,使IT領域更接近於商務領域。
二、轉換
轉換(transformation)是Kettle ETL解決方案中最主要的部分,它處理抽取、轉換、裝載各階段各種對數據行的操作。轉換包括一個或多個步驟(step),如讀取文件、過濾輸出行、數據清洗或將數據裝載到數據庫等等。
轉換裏的步驟通過跳(hop)來連接,跳定義了一個單向通道,允許數據從一個步驟向另一個步驟步驟流動。在Kettle裏,數據的單位是行,數據流就是數據行從一個步驟到另一個步驟的移動。
圖1顯示了一個轉換例子,該轉換從數據庫讀取數據並寫入文本文件。除了步驟和跳,轉換還包括了註釋(note)。註釋是一個文本框,可以放在轉換流程圖的任何位置。註釋的主要目的是使轉換文檔化。
1. 步驟
步驟是轉換的基本組成部分,它以圖標的方式圖形化地展現,這裏顯示了兩個步驟,“表輸入”和“文本文件輸出”。一個步驟有幾個關鍵特性:
- 步驟需要有一個名字,這個名字在轉換範圍內唯一。
- 每個步驟都會讀寫數據行。
- 步驟將數據寫到與之相連的一個或多個輸出跳,再傳送到跳的另一端的步驟。對另一端的步驟來說,這個跳就是一個輸入跳,步驟通過輸入跳接收數據。
- 步驟可以有多個輸出跳。一個步驟的數據發送可以被設置爲輪流發送或複製發送。輪流發送是將數據行依次發給每個輸出跳,複製發送是將全部數據行發送給所有輸出跳。參見“徹底搞清 Kettle 數據分發方式與多線程”
- 在運行時,一個線程運行一個步驟或步驟的一份拷貝,如圖中“表輸入”步驟左上角的X4,表示4個線程執行該步驟,數據行將複製4倍。所有步驟的線程幾乎同時運行,數據行連續地流過步驟之間的跳。
2. 轉換的跳
跳(hop)就是步驟間帶箭頭的連線,跳定義了步驟之間的數據通路。跳實際上是兩個步驟之間的被稱爲行級(row set)的數據行緩存。行集的大小可以在轉換的設置裏定義,缺省爲10000行。當行集滿了,向行集寫數據的步驟將停止寫入,直到行集裏又有了空間。當行集空了,從行集讀取數據的步驟停止讀取,直到行集裏又有可讀的數據行。注意,跳在轉換裏不能循環,因爲在轉換裏每個步驟都依賴於前一個步驟獲取字段。
3. 並行
跳的這種基於行集緩存的規則允許每個步驟都由一個獨立的線程運行,這樣併發程度最高。這一規則也允許以最小消耗內存的數據流的方式來處理。在數據分析中,我們經常要處理大量數據,所以這種併發低耗內存的方式也是ETL工具的核心需求。
對於Kettle轉換,不可能定義一個步驟在另一個步驟之後執行,因爲所有步驟都以併發方式執行:當轉換啓動後,所有步驟都同時啓動,從它們的輸入跳中讀取數據,並把處理過的數據寫到輸出跳,直到輸入跳不再有數據,就中止步驟的運行。當所有的步驟都中止了,整個轉換就中止了。從功能的角度看,轉換具有明確的起點和終點。這裏顯示的轉換起點是“表輸入”步驟,因爲這個步驟生成數據行。終點是“文本文件輸出”步驟,因爲這個步驟將數據寫到文件,而且後面不再有其它節點。
一方面,可以想象數據沿着轉換裏的步驟移動,形成一條行頭到尾的數據通路。而另一方面,轉換裏的步驟幾乎是同時啓動的,所以不可能判斷出哪個步驟是第一個啓動的步驟。如果想要一個任務沿着指定的順序執行,那麼就要使用後面介紹的“作業”了。
4. 數據行
數據以數據行的形式沿着步驟移動。一個數據行是零到多個字段的集合,字段包括這裏所列的幾種數據類型。
- String:字符類型數據。
- Number:雙精度浮點數。
- Integer:帶符號64位長整型。
- BigNumber:任意精度數值。
- Date:帶毫秒精度的日期時間值。
- Boolean:取值爲true或false的布爾值。
- Binary:二進制類型,可以包括圖形、音視頻或其它類型的二進制數據。
每個步驟在輸出數據行時都有對字段的描述,這種描述就是數據行的元數據,通常包括下面一些信息:
- 名稱:行裏的字段名應該是唯一的。
- 數據類型:字段的數據類型。
- 長度:字符串的長度或BigNumber類型的長度。
- 精度:BigNumber數據類型的十進制精度。
- 掩碼:數據顯示的格式(轉換掩碼)。如果要把數值型(Number、Integer、BigNumber)或日期類型轉換成字符串類型就需要用到掩碼。例如在圖形界面中預覽數值型、日期型數據,或者把這些數據保存成文本或XML格式就需要用到這種轉換。
- 小數點:十進制數據的小數點格式。不同文化背景下小數點符號是不同的,一般是點(.)或逗號(,)。
- 分組符號(數字裏的分割符號):數值類型數據的分組符號,不同文化背景下數字裏的分組符號也是不同的,一般是逗號(,)或點(.)或單引號(')。
- 初始步驟:Kettle在元數據裏還記錄了字段是由哪個步驟創建的。可以讓用戶快速定位字段是由轉換裏的哪個步驟最後一次修改或創建。
當設計轉換時有幾個數據類型的規則需要注意:
- 行集裏的所有行都應該有同樣的數據結構。就是說:當從多個步驟向一個步驟裏寫數據時,多個步驟輸出的數據行應該有相同的結構,即字段相同、字段數據類型相同、字段順序相同。
- 字段元數據不會在轉換中發生變化。就是說:字符串不會自動截去長度以適應指定的長度,浮點數也不會自動取整以適應指定的精度。這些功能必須通過一些指定的步驟來完成。
- 默認情況下,空字符串被認爲與NULL相等,但可以通過一個參數kettle_empty_string_differs_from_null來設置。
5. 數據轉換
既可以顯式地轉換數據類型,如在“字段選擇”步驟中直接選擇要轉換的數據類型,也可以隱式地轉換數據類型,如將數值數據寫入數據庫的varchar類型字段。這兩種形式的數據轉換實際上是完全一樣的,都是使用了數據和對數據的描述。
(1)Date和String的轉換
Kettle內部的Date類型裏包含了足夠的信息,可以用這些信息來表現任何毫秒精度的日期、時間值。如果要在String和Date類型之間轉換,唯一要指定的就是日期格式掩碼。這裏顯示的是幾個日期轉換例子。
轉換掩碼(格式) |
結果 |
yyyy/MM/dd’T’HH:mm:ss.SSS |
2019/12/06T21:06:54.321 |
h:mm a |
9:06 PM |
HH:mm:ss |
21:06:54 |
M-d-yy |
12-6-19 |
(2)Numeric和String的轉換
Numeric數據(包括Number、Integer、BigNumber)和String類型之間的轉換用到的幾個字段元數據是:轉換掩碼、小數點符號、分組符號和貨幣符號。這些轉換掩碼只是決定了一個文本格式的字符串如何轉換爲一個數值,而與數值本身的實際精度和舍入無關。這裏顯示了幾個常用的例子。
值 |
轉換掩碼 |
小數點符號 |
分組符號 |
結果 |
1234.5678 |
#,###.### |
. |
, |
1,234.57 |
1234.5678 |
000,000.00000 |
, |
. |
001.234,56780 |
-1.9 |
#.00;-#.00 |
. |
, |
-1.9 |
1.9 |
#.00;-#.00 |
. |
, |
1.9 |
12 |
00000;-00000 |
|
|
00012 |
(3)其它轉換
最後一個表格提供了Boolean和String之間、整型與日期類型之間數據類型轉換的列表。
從 |
到 |
描述 |
Boolean |
String |
轉換爲Y或N,如果設置長度大於等於3,轉換爲true或false |
String |
Boolean |
字符串Y、True、Yes、1都轉換爲true,其它字符串轉換爲false(不區分大小寫) |
Integer |
Date |
整型和日期型之間轉換時,整型就是從1970-01-01 00:00:00 GMT開始計算的毫秒值。 |
Date |
Integer |
三、作業
大多數ETL項目都需要完成各種各樣的維護任務。例如,當運行中發生錯誤,要做哪些操作;如何傳送文件;驗證數據庫表是否存在,等等。而這些操作要按照一定順序完成。因爲轉換以並行方式執行,就需要一個可以串行執行的作業來處理這些操作。
一個作業包括一個或多個作業項,這些作業項以某種順序來執行。作業執行順序由作業項之間的跳(job hop)和每個作業項的執行結果來決定。圖2顯示了一個典型的裝載數據倉庫的作業。
1. 作業項
作業項是作業的基本構成部分。如同轉換的步驟,作業項也可以使用圖標的方式圖形化展示。但是,如果再仔細觀察,還是會發現作業有一些地方不同於步驟:
- 新步驟的名字應該是唯一的,但作業項可以有影子拷貝,如圖中的“錯誤郵件”。這樣可以把一個作業項放在多個不同的位置。這些影子拷貝里的信息都是相同的,編輯了一份拷貝,其它拷貝也會隨之修改。
- 在作業項之間可以傳遞一個結果對象(result object)。這個結果對象裏包含了數據行,它們不是以流的方式來傳遞的,而是等一個作業項執行完了,再傳遞給下一個作業項。
- 默認情況下,所有的作業項都是以串行方式執行的,只是在特殊的情況下以並行方式執行。
因爲作業順序執行作業項,所以必須定義一個起點,如圖中的“start”作業項,就定義了一個起點。一個作業只能定義一個開始作業項。
2. 作業跳
作業的跳是作業項之間的連接線,它定義了作業的執行路徑。作業裏每個作業項的不同運行結果決定了作業的不同執行路徑。對作業項的運行結果的判斷如下:
- 無條件執行:不論上一個作業項執行成功還是失敗,下一個作業項都會執行。這是一種黑色的連接線,上面有一個鎖的圖標,如圖2中 “start”到“傳送數據”作業項之間的連線。
- 當運行結果爲真時執行:當上一個作業項的執行結果爲真時,執行下一個作業項。通常在需要無錯誤執行的情況下使用。這是一種綠色連接線,上面有一個對鉤號的圖標,如圖2中的橫向的三個連線。
- 當運行結果爲假時執行:當上一個作業項的執行結果爲假或沒有成功時,執行下一個作業項。這是一種紅色的連接線,上面有一個紅色的叉子圖標。
在作業項連接(跳)的右鍵菜單上,或跳的小圖標裏都可以設置以上這三種判斷方式。
3. 多路徑和回溯
Kettle使用一種回溯算法來執行作業裏的所有作業項,而且作業項的運行結果(真或假)也決定執行路徑。回溯算法就是:假設執行到了圖裏的一條路徑的某個節點時,要依次執行這個節點的所有子路徑,直到沒有再可以執行的子路徑,就返回該節點的上一節點,再反覆這個過程。
例如,圖3裏的A、B、C三個作業項的執行順序爲:
- 首先“Start”作業項搜索所有下一個節點作業項,找到了“A”和“C”。
- 執行“A”
- 搜索“A”後面的作業項,發現了“B”。
- 執行“B”。
- 搜索“B”後面的作業項,沒有找到任何作業項。
- 回到“A”,也沒有發現其它作業項。
- 回到“Start”,發現另一個要執行的作業項“C”。
- 執行“C”。
- 搜索“C”後面的作業項,沒有找到任何作業項。
- 回到“Start”,沒有找到任何作業項。
- 作業結束。
因爲沒有定義執行順序,所以這個例子的執行順序除了ABC,還可以有CAB。這種回溯算法有兩個重要特徵:
- 因爲作業可以是嵌套的,除了作業項有運行結果,作業也需要一個運行結果,因爲一個作業可以是另一個作業的作業項。一個作業的運行結果,來自於它最後一個執行的作業項。這個例子裏作業的執行順序可以是ABC,也可以是CAB,所以不能保證作業項C的結果就是作業的結果。
- 作業裏允許循環。當在作業裏創建了一個循環,一個作業項就會被執行多次,作業項的多次運行結果會保存在內存裏,便於以後使用。
4. 並行執行
有時候需要將作業項並行執行。這種並行執行也是可以的。一個作業項能以併發的方式執行它後面的作業項,如圖4中上面的作業所示。在這個例子裏,作業項A和C幾乎同時啓動。
需要注意的是,如果A和C是順序的多個作業項,那麼這兩組作業項也是並行執行的,如圖5所示。
在這個例子中,作業項[A、B、寫日誌]和[C、D、清空表]是在兩個線程裏並行執行的。通常設計者也是希望以這樣的方式執行。但有時候,設計者希望一部分作業項並行執行,然後再串行執行其它作業項。這就需要把並行的作業項放到一個新的作業裏,然後作爲另一個作業的作業項,如圖6所示。
5. 作業項結果
作業執行結果不僅決定了作業的執行路徑,而且還向下一個作業項傳遞了一個結果對象。結果對象包括了這裏所示的一些信息。
- 一組數據行:在轉換裏使用“複製行到結果”步驟可以設置這組數據行。與之對應,使用“從結果獲取行”步驟可以獲取這組數據行。在一些作業項裏,如“Shell腳本”、“轉換”、“作業”的設置裏有一個選項可以循環執行這組數據行,這樣可以通過參數化來控制轉換和作業。
- 一組文件名:在作業項的執行過程中可以獲得一些文件名。這組文件名是所有與作業項發生過交互的文件的名稱。例如,一個轉換讀取和處理了10個XML文件,這些文件名就會保留在結果對象裏。使用轉換裏的“從結果獲取文件”步驟可以獲取到這些文件名,除了文件名還能獲取到文件類型。“一般”類型是指所有的輸入輸出文件,“日誌”類型是指Kettle日誌文件。
- 讀、寫、輸入、輸出、更新、刪除、拒絕的行數和轉換裏的錯誤數。
- 腳本作業項的退出狀態:根據腳本執行後的狀態碼,判斷腳本的執行狀態,再執行不同的作業流程。
JavaScript作業項是一個功能強大的作業項,可以實現更高級的流程處理功能。在JavaScript作業項裏,可以設置一些條件,這些條件的結果,可以決定最終執行哪條作業路徑。
四、轉換或作業的元數據
轉換和作業是Kettle的核心組成部分。在介紹Kettle設計原則時曾經討論過,它們可以用XML格式來表示,可以保存在資料庫裏,也可以用Java API的形式來表示。它們的這些表示方式,都依賴於這裏所列的元數據。
- 名字:轉換或作業的名字,儘管名字不是必要的,但應該使用名字,不論是在一個ETL工程內還是在多個ETL工程內,都應該儘可能使用唯一的名字。這樣在遠程執行時或多個ETL工程共用一個資源庫時都會有幫助。
- 文件名:轉換或作業所在的文件名或URL。只有當轉換或作業是以XML文件的形式存儲時,才需要設置這個屬性。當從資源庫加載時,不必設置這個屬性。
- 目錄:這個目錄是指在Kettle資源庫裏的目錄,當轉換或作業保存在資源庫裏時設置。當保存爲XML文件時,不用設置。
- 描述:這是一個可選屬性,用來設置作業或轉換的簡短的描述信息。如果使用了資源庫,這個描述屬性也會出現在資源庫瀏覽窗口的文件列表中。
- 擴展描述:也是一個可選屬性,用來設置作業或轉換的詳細的描述信息。
五、數據庫連接
Kettle裏的轉換和作業使用數據庫連接來連接到關係型數據庫。Kettle數據庫連接實際是數據庫連接的描述:也就是建立實際連接需要的參數。實際連接只是在運行時才建立,定義一個Kettle的數據庫連接並不真正打開一個數據庫的連接。
1. 一般選項
各個數據庫的行爲都不是完全相同的,如圖7所示的Kettle數據庫連接窗口裏有很多種數據庫,而且數據庫的種類還在不斷增多。
在數據庫連接窗口中主要設置三個選項:
- 連接名稱:設定一個在作業或轉換範圍內唯一的名稱。
- 連接類型:從數據庫列表中選擇要要連接的數據庫類型。根據選中數據庫的類型不同,要設置的訪問方式和連接參數設置也不同。某些Kettle步驟或作業項生成SQL語句時使用的方言也不同。
- 訪問方式:在列表裏可以選擇可用的訪問方式,一般都使用JDBC連接。不過也可以使用ODBC數據源、JNDI數據源、Oracle的OCI連接(使用Oracle命名服務)。
根據選擇的數據庫不同,右側面板的連接參數設置也不同,例如圖7中,只有Oracle數據庫可以設置表空間選項。一般常用的連接參數爲:
- 主機名:數據庫服務器的主機名或IP地址。
- 數據庫名:要訪問的數據庫名。
- 端口號:默認是選中的數據庫服務器的默認端口號。
- 用戶名和密碼:連接數據庫服務器的用戶名和密碼。
2. 特殊選項
對於大多數用戶來說,使用數據庫連接窗口的“一般”標籤就足夠了。但偶爾也可能需要設置對話框裏的“高級”標籤的內容,如圖8所示。
- 支持Boolean數據類型:對Boolean(bit)數據類型,大多數數據庫的處理方式都不相同,即使同一個數據庫的不同版本也可能不同。許多數據庫根本不支持Boolean類型。所以默認情況下,Kettle使用一個char(1)字段的不同值(如Y或N)來代替Boolean字段。如果選中了這個選項,Kettle就會爲支持Boolean類型的數據庫生成正確的SQL方言。
- 雙引號分割標識符:強迫SQL語句裏的所有標識符(如列名、表名)加雙引號,一般用於區分大小寫的數據庫,或者懷疑Kettle裏定義的關鍵字列表和實際數據庫不一致。
- 強制轉爲小寫:將所有表名和列名轉爲小寫。
- 強制轉爲大寫:將所有表名和列名轉爲大寫。
- 默認模式名:當不明確指定模式名時默認的模式名。
- 連接後要執行的SQL語句:一般用於建立連接後,修改某些數據庫參數,如Session級的變量或調試信息等。
除了這些高級選項,在連接對話框的 “選項”標籤下,還可以設置數據庫特定的參數,如一些連接參數。爲了便於使用,對於某些數據庫(如MySQL),Kettle提供了一些默認的連接參數和值。有幾種數據庫類型,Kettle還提供了連接參數的幫助文檔,通過單擊“選項”標籤中的“幫助”按鈕可以打開對應數據庫的幫助頁面。
最後,還可以選擇Apache的通用數據庫連接池的選項。如果運行了很多小的轉換或作業,這些轉換或作業裏又定義了生命期短的數據庫連接,連接池選項就顯得有意義了。連接池選項不會限制併發數據庫連接的數量。
3. 關係數據庫的力量
關係數據庫是一種高級的軟件,它在數據的連接、合併、排序等方面有着突出的優勢。和基於流的數據處理引擎,如Kettle相比,它有一大優點:數據庫使用的數據都存儲在磁盤中。當關系型數據庫進行連接或排序操作時,只要使用這些數據的引用即可,而不用把這些數據裝載到內存裏,這就體現出明顯的性能方面的優勢。但缺點也是很明顯的,把數據裝載到關係數據庫裏也會產生性能的瓶頸。
對ETL開發者而言,要儘可能利用數據庫自身的性能優勢,來完成連接或排序這樣的操作。如果不能在數據庫裏進行連接這樣的操作,如數據的來源不同,也應該現在數據庫裏排序,以便在ETL裏做連接操作。
4. 連接和事務
數據庫連接只在執行作業或轉換時使用。在作業裏,每一個作業項都打開和關閉一個獨立的數據庫連接。轉換也是如此。但是因爲轉換裏的步驟是並行的,每個步驟都打開一個獨立的數據庫連接並開始一個事務。儘管這樣在很多情況下會提高性能,但當不同步驟更新同一個表時,也會帶來鎖和參照完整性問題。
爲了解決打開多個連接而產生的問題,Kettle可以在一個事務中完成轉換。在轉換設置對話框的 “雜項”標籤中,設置“使用唯一連接”,可以完成此功能。當選中了這個選項,所有步驟裏的數據庫連接都使用同一個數據庫連接。只有所有步驟都正確,轉換正確執行,才提交事務,否則回滾事務。
5. 數據庫集羣
當一個大數據庫不再滿足需求時,就會考慮用很多小的數據庫來處理數據。通常可以使用數據庫分片技術來分散數據裝載。這種方法可以將一個大數據集分爲幾個數據分區(或分片),每個分區都保存在獨立的數據庫實例裏。這種方法的優點顯而易見,可以大幅減少每個表或每個數據庫實例的行數。所有分片的組合就是數據庫集羣。
一般採用標識符計算餘數的方法來決定分片的數據保存到哪個數據庫實例裏。這種分片計算方法得到的分片標識是一組0到“分片數-1”之間的數字,可以在數據庫連接對話框的“集羣”標籤下設置分區數。例如,定義了五個數據庫連接作爲集羣裏的五個數據分片。可以在“表輸入”步驟裏執行一個查詢,這個查詢就以分區的方式執行:同樣的一個查詢會被執行五遍,每個數據分區執行一遍。在Kettle裏,所有使用數據庫連接的步驟都可以使用分片的特性。例如,表輸出步驟在分片模式下會把不同的數據行輸出到不同的數據分區(片)中。參見“Kettle數據庫連接中的集羣與分片”
六、工具
Kettle裏有不同的工具,用於ETL的不同階段。主要工具包括:
- Spoon:是圖形化工具,用於快速設計和維護複雜的ETL工作流。
- Kitchen:運行作業的命令行工具。
- Pan:運行轉換的命令行工具。
- Carte:輕量級Web服務器,用來遠程執行轉換或作業,一個運行有Carte進程的機器可以作爲從服務器,從服務器是Kettle集羣的一部分。
參見“Kettle工具——Spoon、Kitchen、Pan、Carte”。
七、資源庫
當ETL項目規模比較大,有很多ETL開發人員在一起工作,開發人員之間的合作就顯得很重要。Kettle以插件的方式靈活定義不同種類的資源庫,但不論是哪種資源庫,它們的基本要素是相同的:這些資源庫都使用相同的用戶界面、存儲相同的元數據。目前有3種常見資源庫:數據庫資源庫、Pentaho資源庫和文件資源庫。
- 數據庫資源庫:數據庫資源庫是把所有的ETL信息保存在關係數據庫中,這種資源庫比較容易創建,只要新建一個數據庫連接即可。可以使用“數據庫資源庫”對話框來創建資源庫裏的表和索引。
- Pentaho資源庫:Pentaho資源庫是一個插件,在Kettle的企業版中有這個插件。這種資源庫實際是一個內容管理系統(CMS),它具備一個理想的資源庫的所有特性,包括版本控制和依賴完整性檢查。
- 文件資源庫:文件資源庫是在一個文件目錄下定義一個資源庫。因爲Kettle使用的是Apache VFS虛擬文件系統,所以這裏的文件目錄是一個廣泛的概念,包括zip文件、Web服務、FTP服務等。
無論哪種資源庫都應該具有下面的特性:
- 中央存儲:在一箇中心位置存儲所有的轉換和作業。ETL用戶可以訪問到工程的最新視圖。
- 文件加鎖:防止多個用戶同時修改。
- 修訂管理:一個理想的資源庫可以存儲一個轉換或作業的所有歷史版本,以便將來參考。可以打開歷史版本,並查看變更日誌。
- 依賴完整性檢查:檢查資源庫轉換或作業之間的相互依賴關係,可以確保資源庫裏沒有丟失任何鏈接,沒有丟失任何轉換、作業或數據庫連接。
- 安全性:安全性可以防止未授權的用戶修改或執行ETL作業。
- 引用:重新組織轉換、作業,或簡單重新命名,都是ETL開發人員的常見工作。要做好這些工作,需要完整的轉換或作業的引用。
八、虛擬文件系統
靈活而統一的文件處理方式對ETL工具來說非常重要。所以Kettle支持URL形式的文件名,Kettle使用Apache的通用VFS作爲文件處理接口,替用戶解決各種文件處理方面的複雜情況。例如,使用Apache VFS可以選中.zip壓縮包內的多個文件,和在一個本地目錄下選擇多個文件一樣方便。這裏顯示的是VFS的一些典型的例子。
文件名例子 |
描述 |
文件名:/data/input/customets.dat |
這是最典型的定義文件的方式 |
文件名:file:///data/input/customers.dat |
Apache VFS可以從本地文件系統中找到文件 |
作業:http://www.kettle.be/GenerateRows.kjb |
這個文件可以加載到Spoon裏,可以使用Kitchen執行,可以在作業項裏引用。這個文件通過Web服務器加載 |
目錄:zip:file:///C:/input/salesdata.zip 通配符:.*\.txt$ |
在“文本文件輸入”這樣的步驟裏可以輸入目錄和文件通配符。例子裏的文件名和通配符的組合將查找zip文件裏的所有以.txt結尾的文件 |