Pentaho 資料整合工具——Kettle(一)
簡介
Pentaho是一個以工作流為核心的、強調面向解決方案的開源商業智慧(Business Intelligence, BI)套件,以構成全面的資料整合和業務分析平臺。這些套件各自為獨立產品,之間為鬆耦合可插拔式設計,使用者可根據自身需求進行靈活選擇。Kettle是Pentaho整個產品體系中的資料整合模組,使用突破性的元資料驅動方法提供強大的“提取,轉換和載入(ETL)”功能。主要使用在資料倉庫環境下,同時還可以:在應用程式或資料庫之間進行資料遷移、將資料從資料庫中匯出到文字檔案中、將大量資料載入到資料庫中、資料清理、應用程式整合等。作為最受歡迎的開源ETL工具,其支援大量的輸入和輸出格式,包括文字檔案、資料表,以及各類商業或開源的資料庫引擎。除此之外,Kettle還易於使用,使用者可通過圖形化介面定義任務或轉換,無需編寫程式碼。當然,Kettle支援使用者使用指令碼語言定義更加豐富的個性化功能。
Kettle元件
Kettle包含有ETL開發和部署流程設計的多個程式,每個程式都有各自的功能。如下圖所示,為Kettle的主體框架圖。
Kettle框架圖
-
Spoon:Kettle的視覺化整合開發環境。提供一個圖形化使用者介面,使用者可以以拖拽的方式建立、定義作業或轉換。另外,Spoon還可以用於執行、除錯使用者定義的作業或轉換,及時看到實際效果,以提升使用者開發和測試效率。對於遠端執行或叢集模式,Spoon可以監控各個子節點的作業或轉換執行情況。下圖為Spoon的操作介面,其中有一個定義好的作業流。
Spoon介面
-
Kitchen:伺服器端作業的命令列執行程式,可通過Shell指令碼呼叫,從而在伺服器端啟動使用者定義的作業。在開發和測試除錯階段,作業和轉換可以在圖形化的Spoon中執行。但在實際執行環境中,Spoon就較少用到。在實際部署階段,一般需要通過將命令列放入Shell指令碼中,並定時排程此指令碼進行執行。Kitchen和Pan命令列工具就用於此場景下,進行實際的部署使用;
-
Pan:伺服器端轉換的命令列執行程式,和Kitchen一樣可通過Shell指令碼來呼叫,從而在伺服器端執行使用者定義的轉換;
-
Carte:輕量級的HTTP服務,在後臺執行HTTP監聽,以接收遠端的作業,從而實現遠端執行作業和轉換。但是與Kitchen不同的是,Carte是一個一直在後臺執行的服務,在後臺某個埠來監聽HTTP請求,而Kitchen是執行完一個作業後就退出。遠端機器給Carte傳送一個請求,在請求裡包含了作業的定義。Carte收到請求後,對作業進行解析、執行。除了能夠處理遠端作業請求之外,Carte也能夠處理對於本節點各種監控資訊的請求。Carte的以上功能使得Kettle能夠具備叢集功能,叢集可將單個工作或轉換進行分割,在Carte伺服器的多個節點上並行執行,從而最大化利用叢集資源。
轉換
轉換(Transformation)是Kettle中最重要的部分,可以處理ETL整個流程:抽取、轉換、載入,各階段對資料的各種操作。下圖是一個完整的轉換任務。
轉換包括一個或多個步驟(Step),實現例如讀取檔案、資料清洗、資料載入等對於資料流的操作。步驟是轉換裡最基本的元素,並以圖示形式圖形化的展現。轉換中包括各種不同功能的步驟。如上圖所示,顯示了四個步驟,分別有資料庫查詢、設定欄位值、分組、輸出到Hadoop檔案系統的功能。每個步驟都需使用者定義一個名字,這個名字在轉換範圍內要唯一。在Kettle中,資料的單位是行。除了“生成記錄”步驟之外,每個步驟都會讀、寫資料行。步驟將資料寫到與之相連的一個或多個輸出跳(Outgoing Hops),從而傳送給另一端的步驟。對於另一端的步驟來說,這個跳就是輸入跳(Incoming Hops),步驟通過輸入跳來接收資料。當一個步驟有多個輸出跳時,資料可以被設定為輪流傳送和複製傳送。輪流傳送時將資料行依次發給每一個輸出跳,複製傳送是將全部資料行傳送給所有輸出跳。在實際執行轉換時,每個步驟或步驟的多份拷貝都由獨自的執行緒來執行。所有步驟的執行緒幾乎同時執行,並沒有固定的先後順序,因此可以認為轉換中的步驟是並行執行的。資料行連續地通過跳來經過各個步驟,從而完成對於資料流的轉換處理。除了以上這些通用功能,每種步驟都有各自的獨特功能。
各個步驟之間的關聯關係是通過跳(Hop)來連線,跳就是步驟之間帶箭頭的連線,從而定義了步驟之間的資料通路。實際上,跳是兩個步驟之間被稱為行集(Row Set)的資料行快取(快取大小可以設定)。當行集滿時,向行集寫入的步驟將停止寫入。當行集空時,從行集讀取資料的步驟停止讀取,直到行集中又有新的資料行。當轉換啟動後,轉換中所有的步驟都同時啟動,從各自的輸入跳中讀取資料,並把處理過的資料行寫到輸出跳,直到輸入跳裡不再有資料就終止步驟的執行。當轉換中所有的步驟都終止時,整個轉換也就終止了。
在轉換中,資料以行的形式進行流動,一個數據行其實就是一個或多個欄位的集合。與資料庫中表的欄位類似,各個欄位可以具有不同的名稱與資料型別。
作業
轉換中定義的是對資料流的各類操作,而作業中定義的就是控制流。在實際專案中,ETL工作都含有一些流程性的任務,這些任務具有一定的先後執行順序以及條件判斷。在Kettle中,作業用來應對此類場景。與轉換以並行方式執行各個步驟不同,作業是以序列的方式來執行。如下圖所示,為一個完整的作業流。一個作業包括一個或多個作業項,作業項之間用跳(Job Hop)來連線。作業的執行順序由跳,以及每個作業項的執行結果來決定,使用者可以自定義。
針對作業項的執行結果,作業跳有以下情形:
-
無條件執行,無論上一個作業項執行成功與否,下一個作業都會執行,如上圖,為其中黑色帶鎖的連線線;
-
當執行結果為真時執行,當上一個作業項執行成功時,才執行下一個作業項,如上圖,為其中綠色帶對號的連線線;
-
當執行結果為假時執行,當上一個作業項執行失敗時,執行下一個作業項,如上圖,為其中紅色帶叉號的連線線。
如同轉換的步驟,作業中的作業項也使用圖示的方式進行圖形化展示。使用者可以複製出作業項的多個影子拷貝,影子拷貝的配置資訊都是一樣的,編輯一份拷貝其它拷貝也會隨之修改。與轉換不同,作業中作業項之間並不是資料流的傳遞。作業項之間可傳遞一個結果物件(Result Object),從而來實現相互之間的資料傳遞。結果物件類似於資料庫中的一張表,其中包含欄位與資料集。預設情況下,作業項之間是以序列的方式執行,需等一個作業項完全執行結束,才將結果物件傳遞給下一個作業項執行。
因為作業是可以相互巢狀的,一個作業可以作為另外一個作業的作業項,因此作業也要同作業項一樣有執行結果。一個作業的執行結果來自於它最後一個執行的作業項。
多執行緒
通過設定步驟的“改變開始複製的數量”屬性,可實現步驟的多執行緒執行。如上圖所示,為“字串替換”步驟設定“改變開始複製的數量”屬性為5,從而實現此步驟5個執行緒併發執行的效果,從而提升資料處理效率。前一個步驟通過輪詢的方式將資料流按照行,分別傳送給後面的步驟處理執行緒。
作業中的作業項也可以實現並行執行。如上圖所示,作業項【轉換,Shell】和【轉換2,SQL】是分別在兩個執行緒中並行執行的。
結束語
本文介紹了開源ETL工具Kettle,其作為開源商業智慧Pentaho產品體系中的資料整合模組,能夠靈活高效應對各類ETL應用場景。Kettle是一個非常強大的工具,本文對其基本的概念和使用方式進行了介紹。後續還將介紹Kettle的叢集模式,並給出一個實際的應用案例,從而方便大家更好的理解。