目錄程序員
2、轉換數據庫
1. 步驟編程
2. 轉換的跳緩存
3. 並行安全
4. 數據行服務器
5. 數據轉換數據結構
Kettle是一款流行的ETL(Extract-Transform-Load,即數據抽取、轉換、裝載)工具,並可用來操做Hadoop上的數據。Kettle是用Java語言開發的。它最初的做者Matt Casters原是一名C語言程序員,在着手開發Kettle時仍是一名Java小白,可是他僅用了一年時間就開發出了Kettle的第一個版本。雖然有不少不足,但這版畢竟是可用的。使用本身並不熟悉的語言,僅憑一己之力在很短的時間裏就開發出了複雜的ETL系統工具,做者的開發能力和實踐精神使人十分佩服。後來Pentaho公司得到了Kettle源代碼的版權,Kettle也隨之改名爲Pentaho Data Integration,簡稱PDI。
1、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領域更接近於商務領域。
2、轉換
轉換(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 |
3、做業
大多數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做業項裏,能夠設置一些條件,這些條件的結果,能夠決定最終執行哪條做業路徑。
4、轉換或做業的元數據
轉換和做業是Kettle的核心組成部分。在介紹Kettle設計原則時曾經討論過,它們能夠用XML格式來表示,能夠保存在資料庫裏,也能夠用Java API的形式來表示。它們的這些表示方式,都依賴於這裏所列的元數據。
- 名字:轉換或做業的名字,儘管名字不是必要的,但應該使用名字,不管是在一個ETL工程內仍是在多個ETL工程內,都應該儘量使用惟一的名字。這樣在遠程執行時或多個ETL工程共用一個資源庫時都會有幫助。
- 文件名:轉換或做業所在的文件名或URL。只有當轉換或做業是以XML文件的形式存儲時,才須要設置這個屬性。當從資源庫加載時,沒必要設置這個屬性。
- 目錄:這個目錄是指在Kettle資源庫裏的目錄,當轉換或做業保存在資源庫裏時設置。當保存爲XML文件時,不用設置。
- 描述:這是一個可選屬性,用來設置做業或轉換的簡短的描述信息。若是使用了資源庫,這個描述屬性也會出如今資源庫瀏覽窗口的文件列表中。
- 擴展描述:也是一個可選屬性,用來設置做業或轉換的詳細的描述信息。
5、數據庫鏈接
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數據庫鏈接中的集羣與分片」
6、工具
Kettle裏有不一樣的工具,用於ETL的不一樣階段。主要工具包括:
- Spoon:是圖形化工具,用於快速設計和維護複雜的ETL工做流。
- Kitchen:運行做業的命令行工具。
- Pan:運行轉換的命令行工具。
- Carte:輕量級Web服務器,用來遠程執行轉換或做業,一個運行有Carte進程的機器能夠做爲從服務器,從服務器是Kettle集羣的一部分。
參見「Kettle工具——Spoon、Kitchen、Pan、Carte」。
7、資源庫
當ETL項目規模比較大,有不少ETL開發人員在一塊兒工做,開發人員之間的合做就顯得很重要。Kettle以插件的方式靈活定義不一樣種類的資源庫,但不管是哪一種資源庫,它們的基本要素是相同的:這些資源庫都使用相同的用戶界面、存儲相同的元數據。目前有3種常見資源庫:數據庫資源庫、Pentaho資源庫和文件資源庫。
- 數據庫資源庫:數據庫資源庫是把全部的ETL信息保存在關係數據庫中,這種資源庫比較容易建立,只要新建一個數據庫鏈接便可。可使用「數據庫資源庫」對話框來建立資源庫裏的表和索引。
- Pentaho資源庫:Pentaho資源庫是一個插件,在Kettle的企業版中有這個插件。這種資源庫實際是一個內容管理系統(CMS),它具有一個理想的資源庫的全部特性,包括版本控制和依賴完整性檢查。
- 文件資源庫:文件資源庫是在一個文件目錄下定義一個資源庫。由於Kettle使用的是Apache VFS虛擬文件系統,因此這裏的文件目錄是一個普遍的概念,包括zip文件、Web服務、FTP服務等。
不管哪一種資源庫都應該具備下面的特性:
- 中央存儲:在一箇中心位置存儲全部的轉換和做業。ETL用戶能夠訪問到工程的最新視圖。
- 文件加鎖:防止多個用戶同時修改。
- 修訂管理:一個理想的資源庫能夠存儲一個轉換或做業的全部歷史版本,以便未來參考。能夠打開歷史版本,並查看變動日誌。
- 依賴完整性檢查:檢查資源庫轉換或做業之間的相互依賴關係,能夠確保資源庫裏沒有丟失任何連接,沒有丟失任何轉換、做業或數據庫鏈接。
- 安全性:安全性能夠防止未受權的用戶修改或執行ETL做業。
- 引用:從新組織轉換、做業,或簡單從新命名,都是ETL開發人員的常見工做。要作好這些工做,須要完整的轉換或做業的引用。
8、虛擬文件系統
靈活而統一的文件處理方式對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結尾的文件 |