Kettle構(gòu)建Hadoop ETL實踐(一):ETL與Kettle
點擊上方藍色字體,選擇“設(shè)為星標”
回復”資源“獲取更多資源

(一)ETL與Kettle的基本概念
(二)Kettle及其使用環(huán)境的安裝與配置
(三)Kettle對Hadoop的支持
(四)建立ETL示例模型
(五)數(shù)據(jù)抽取
(六)數(shù)據(jù)轉(zhuǎn)換與裝載
(七)定期自動執(zhí)行ETL作業(yè)
(八)維度表技術(shù)(增加列、維度子集、角色扮演維度、層次維度、退化維度、雜項維度、維度合并、分段維度)?
(九)事實表技術(shù)(周期快照、累計維度、無事實的事實表、遲到的事實、累積度量)
(十)Kettle數(shù)據(jù)分發(fā)與多線程
(十一)Kettle集群與數(shù)據(jù)分片
(十二)Kettle元數(shù)據(jù)管理對于每一種技術(shù),先要理解相關(guān)的概念和它之所以出現(xiàn)的原因,這對于我們繼續(xù)深入學習其技術(shù)細節(jié)大有裨益。源于一貫的學習方法和習慣,讓我們還是先從基本概念開始吧。一、ETL基礎(chǔ)ETL一詞是Extract、Transform、Load三個英文單詞的首字母縮寫,中文意為抽取、轉(zhuǎn)換、裝載。
抽取——從操作型數(shù)據(jù)源獲取數(shù)據(jù)。
轉(zhuǎn)換——轉(zhuǎn)換數(shù)據(jù),使之轉(zhuǎn)變?yōu)檫m用于查詢和分析的形式和結(jié)構(gòu)。
裝載——將轉(zhuǎn)換后的數(shù)據(jù)導入到最終的目標數(shù)據(jù)倉庫。
1. 數(shù)據(jù)倉庫架構(gòu)中的ETL
可以把數(shù)據(jù)倉庫架構(gòu)理解成構(gòu)成數(shù)據(jù)倉庫的組件及其之間的關(guān)系,那么就有了下面的數(shù)據(jù)倉庫架構(gòu)圖。
圖1-1 數(shù)據(jù)倉庫架構(gòu)圖1-1中顯示的整個數(shù)據(jù)倉庫環(huán)境包括操作型系統(tǒng)和數(shù)據(jù)倉庫系統(tǒng)兩大部分。操作型系統(tǒng)的數(shù)據(jù)由各種形式的業(yè)務(wù)數(shù)據(jù)組成,這其中可能包含關(guān)系數(shù)據(jù)庫、TXT或CSV文件、HTML或XML文檔,還可能存在外部系統(tǒng)的數(shù)據(jù),比如網(wǎng)絡(luò)爬蟲抓取來的互聯(lián)網(wǎng)數(shù)據(jù)等。數(shù)據(jù)可能是結(jié)構(gòu)化、半結(jié)構(gòu)化或非結(jié)構(gòu)化的。這些數(shù)據(jù)經(jīng)過ETL過程進入數(shù)據(jù)倉庫系統(tǒng)。這里把ETL分成了抽取和轉(zhuǎn)換裝載兩個部分。抽取過程負責從操作型系統(tǒng)獲取數(shù)據(jù),該過程一般不做數(shù)據(jù)聚合和匯總,但是會按照主題進行集成,物理上是將操作型系統(tǒng)的數(shù)據(jù)全量或增量復制到數(shù)據(jù)倉庫系統(tǒng)的RDS中。Hadoop生態(tài)圈中的主要數(shù)據(jù)抽取工具是Sqoop。Sqoop被設(shè)計成支持在關(guān)系數(shù)據(jù)庫和Hadoop之間傳輸數(shù)據(jù)。轉(zhuǎn)換裝載過程將數(shù)據(jù)進行清洗、過濾、匯總、統(tǒng)一格式化等一系列轉(zhuǎn)換操作,使數(shù)據(jù)轉(zhuǎn)為適合查詢的格式,然后裝載進數(shù)據(jù)倉庫系統(tǒng)的TDS中。傳統(tǒng)數(shù)據(jù)倉庫的基本模式是用一些過程將操作型系統(tǒng)的數(shù)據(jù)抽取到文件,然后另一些過程將這些文件轉(zhuǎn)化成MySQL或Oracle這樣的關(guān)系數(shù)據(jù)庫的記錄。最后,第三部分過程負責把數(shù)據(jù)導入進數(shù)據(jù)倉庫。RDS(Raw Data Stores)是原始數(shù)據(jù)存儲的意思。將原始數(shù)據(jù)保存到數(shù)據(jù)倉庫里是個不錯的想法。ETL過程的bug或系統(tǒng)中的其它錯誤是不可避免的,保留原始數(shù)據(jù)使得追蹤并修改這些錯誤成為可能。有時數(shù)據(jù)倉庫的用戶會有查詢細節(jié)數(shù)據(jù)的需求,這些細節(jié)數(shù)據(jù)的粒度與操作型系統(tǒng)的相同。有了RDS,這種需求就很容易實現(xiàn),用戶可以查詢RDS里的數(shù)據(jù)而不必影響業(yè)務(wù)系統(tǒng)的正常運行。這里的RDS實際上是起到了操作型數(shù)據(jù)存儲(Operational Data Store,ODS)的作用。TDS(Transformed Data Stores)意為轉(zhuǎn)換后的數(shù)據(jù)存儲,是真正的數(shù)據(jù)倉庫中的數(shù)據(jù)。大量用戶會在經(jīng)過轉(zhuǎn)換的數(shù)據(jù)集上處理他們的日常查詢。如果前面的工作做得好,這些數(shù)據(jù)的構(gòu)建方式將保證最重要的和最頻繁的查詢能夠快速執(zhí)行。這里的原始數(shù)據(jù)存儲和轉(zhuǎn)換后的數(shù)據(jù)存儲是邏輯概念,它們可能物理存儲在一起,也可能分開。當原始數(shù)據(jù)存儲和轉(zhuǎn)換后的數(shù)據(jù)存儲物理上分開時,它們不必使用同樣的軟硬件。傳統(tǒng)數(shù)據(jù)倉庫中,原始數(shù)據(jù)存儲通常是本地文件系統(tǒng),數(shù)據(jù)被組織進相應(yīng)的目錄中,這些目錄是基于數(shù)據(jù)從哪里抽取或何時抽取建立(例如以日期作為文件或目錄名稱的一部分)。轉(zhuǎn)換后的數(shù)據(jù)存儲一般使用某種關(guān)系數(shù)據(jù)庫。在Hadoop生中,可以這兩類數(shù)據(jù)邏輯上分開,物理上通過在Hive中建立兩個不同的數(shù)據(jù)庫來實現(xiàn),最終所有數(shù)據(jù)都被分布存儲到HDFS上。自動化調(diào)度組件的作用是自動定期重復執(zhí)行ETL過程。不同角色的數(shù)據(jù)倉庫用戶對數(shù)據(jù)的更新頻率要求也會有所不同,例如財務(wù)主管需要每月的營收匯總報告,而銷售人員想看到每天的產(chǎn)品銷售數(shù)據(jù)。作為通用需求,所有數(shù)據(jù)倉庫系統(tǒng)都應(yīng)該能夠建立周期性自動執(zhí)行的工作流作業(yè)。ETL過程自動化是數(shù)據(jù)倉庫成功的重要衡量標準。傳統(tǒng)數(shù)據(jù)倉庫一般利用操作系統(tǒng)自帶的調(diào)度功能(如Linux的cron或Windows的計劃任務(wù))實現(xiàn)作業(yè)自動執(zhí)行。Hadoop生態(tài)圈中有一個叫做Oozie的工具,它是一個Hadoop的工作流調(diào)度系統(tǒng),可以使用它將ETL過程封裝進工作流自動執(zhí)行。數(shù)據(jù)目錄有時也被稱為元數(shù)據(jù)存儲,它可以提供一份數(shù)據(jù)倉庫中數(shù)據(jù)的清單。用戶通過它應(yīng)該可以快速解決這些問題:什么類型的數(shù)據(jù)被存儲在哪里,數(shù)據(jù)集的構(gòu)建有何區(qū)別,數(shù)據(jù)最后的訪問或更新時間等。此外還可以通過數(shù)據(jù)目錄感知數(shù)據(jù)是如何被操作和轉(zhuǎn)換的。一個好的數(shù)據(jù)目錄是讓用戶體驗到系統(tǒng)易用性的關(guān)鍵。Hadoop生態(tài)圈中主要的數(shù)據(jù)目錄工具是HCatalog,它是Hadoop上的一個表和存儲管理層。查詢引擎組件負責實際執(zhí)行用戶查詢。傳統(tǒng)數(shù)據(jù)倉庫中,它可能是存儲轉(zhuǎn)換后數(shù)據(jù)的Oracle、MySQL等關(guān)系數(shù)據(jù)庫系統(tǒng)內(nèi)置的查詢引擎,還可能是以固定時間間隔向其導入數(shù)據(jù)的OLAP立方體,如Essbase cube。Hadoop生態(tài)圈中的主要SQL查詢引擎有基于MapReduce的Hive、基于RDD的SparkSQL和基于MPP的Impala等。用戶界面指的是最終用戶所使用的接口程序??赡苁且粋€GUI軟件,如BI套件的中的客戶端軟件,也可能就只是一個瀏覽器。Hadoop生態(tài)圈中比較知名的數(shù)據(jù)可視化工具是Hue和Zeppelin。本專題的(三)Kettle對Hadoop的支持 將詳細介紹如何在Kettle中使用Hadoop相關(guān)組件。
2. 數(shù)據(jù)抽取
抽取操作從源系統(tǒng)獲取數(shù)據(jù)給后續(xù)的數(shù)據(jù)倉庫環(huán)境使用。這是ETL處理的第一步,也是最重要的一步。數(shù)據(jù)被成功抽取后,才可以進行轉(zhuǎn)換并裝載到數(shù)據(jù)倉庫中。能否正確地獲取數(shù)據(jù)直接關(guān)系到后面步驟的成敗。數(shù)據(jù)倉庫典型的源系統(tǒng)是事務(wù)處理應(yīng)用,例如,一個銷售分析數(shù)據(jù)倉庫的源系統(tǒng)之一,可能是一個訂單錄入系統(tǒng),其中包含當前銷售訂單相關(guān)操作的全部記錄。設(shè)計和建立數(shù)據(jù)抽取過程,在ETL處理乃至整個數(shù)據(jù)倉庫處理過程中,一般是較為耗時的任務(wù)。源系統(tǒng)很可能非常復雜并且缺少相應(yīng)的文檔,因此只是決定需要抽取哪些數(shù)據(jù)可能就已經(jīng)非常困難了。通常數(shù)據(jù)都不是只抽取一次,而是需要以一定的時間間隔反復抽取,通過這樣的方式把數(shù)據(jù)的所有變化提供給數(shù)據(jù)倉庫,并保持數(shù)據(jù)的及時性。除此之外,源系統(tǒng)一般不允許外部系統(tǒng)對它進行修改,也不允許外部系統(tǒng)對它的性能和可用性產(chǎn)生影響,數(shù)據(jù)倉庫的抽取過程要能適應(yīng)這樣的需求。如果已經(jīng)明確了需要抽取的數(shù)據(jù),下一步就該考慮從源系統(tǒng)抽取數(shù)據(jù)的方法了。對抽取方法的選擇高度依賴于源系統(tǒng)和目標數(shù)據(jù)倉庫環(huán)境的業(yè)務(wù)需要。一般情況下,不可能因為需要提升數(shù)據(jù)抽取的性能,而在源系統(tǒng)中添加額外的邏輯,也不能增加這些源系統(tǒng)的工作負載。有時,用戶甚至都不允許增加任何“開箱即用”的外部應(yīng)用系統(tǒng),這被認為是對源系統(tǒng)具有侵入性。下面分別從邏輯和物理兩方面介紹數(shù)據(jù)抽取方法。(1)邏輯抽取
有兩種邏輯抽取類型:全量抽取和增量抽取。全量抽取源系統(tǒng)的數(shù)據(jù)全部被抽取。因為這種抽取類型影響源系統(tǒng)上當前所有有效的數(shù)據(jù),所以不需要跟蹤自上次成功抽取以來的數(shù)據(jù)變化。源系統(tǒng)只需要原樣提供現(xiàn)有的數(shù)據(jù)而不需要附加的邏輯信息(比如時間戳等)。一個全表導出的數(shù)據(jù)文件或者一個查詢源表所有數(shù)據(jù)的SQL語句,都是全量抽取的例子。增量抽取
只抽取某個事件發(fā)生的特定時間點之后的數(shù)據(jù)。通過該事件發(fā)生的時間順序能夠反映數(shù)據(jù)的歷史變化,它可能是最后一次成功抽取,也可能是一個復雜的業(yè)務(wù)事件,如最后一次財務(wù)結(jié)算等。必須能夠標識出特定時間點之后所有的數(shù)據(jù)變化。這些發(fā)生變化的數(shù)據(jù)可以由源系統(tǒng)自身來提供,例如能夠反映數(shù)據(jù)最后發(fā)生變化的時間戳列,或者是一個原始事務(wù)處理之外的,只用于跟蹤數(shù)據(jù)變化的變更日志表。大多數(shù)情況下,使用后者意味著需要在源系統(tǒng)上增加數(shù)據(jù)抽取邏輯。在許多數(shù)據(jù)倉庫中,抽取過程不含任何變化數(shù)據(jù)捕獲技術(shù)。取而代之的是,把源系統(tǒng)中的整個表抽取到數(shù)據(jù)倉庫過渡區(qū)(Staging Area),然后用這個表的數(shù)據(jù)和上次從源系統(tǒng)抽取得到的表數(shù)據(jù)作比對,從而找出發(fā)生變化的數(shù)據(jù)。雖然這種方法不會對源系統(tǒng)造成很大的影響,但顯然需要考慮給數(shù)據(jù)倉庫處理增加的負擔,尤其是當數(shù)據(jù)量很大的時候。
(2)物理抽取
依賴于選擇的邏輯抽取方法,還有能夠?qū)υ聪到y(tǒng)所做的操作和所受的限制,存在兩種物理數(shù)據(jù)抽取機制:直接從源系統(tǒng)聯(lián)機抽取或者間接從一個脫機結(jié)構(gòu)抽取數(shù)據(jù)。這個脫機結(jié)構(gòu)有可能已經(jīng)存在,也可能得需要由抽取程序生成。聯(lián)機抽取數(shù)據(jù)直接從源系統(tǒng)抽取。抽取進程或者直連源系統(tǒng)數(shù)據(jù)庫訪問它們的數(shù)據(jù)表,或者連接到一個存儲快照日志或變更記錄的中間層系統(tǒng)(如MySQL數(shù)據(jù)庫的binlog)。注意這個中間層系統(tǒng)并不需要必須和源系統(tǒng)物理分離。脫機抽取
數(shù)據(jù)不從源系統(tǒng)直接抽取,而是從一個源系統(tǒng)以外的過渡區(qū)抽取。過渡區(qū)可能已經(jīng)存在(例如數(shù)據(jù)庫備份文件、關(guān)系數(shù)據(jù)庫系統(tǒng)的重做日志、歸檔日志等),或者抽取程序自己建立。應(yīng)該考慮以下的存儲結(jié)構(gòu):
數(shù)據(jù)庫備份文件。一般需要數(shù)據(jù)還原操作才能使用。
備用數(shù)據(jù)庫。如Oracle的DataGuard和MySQL的數(shù)據(jù)復制等技術(shù)。
平面文件。數(shù)據(jù)定義成普通格式,關(guān)于源對象的附加信息(列名、數(shù)據(jù)類型等等)需要另外處理。
導出文件。關(guān)系數(shù)據(jù)庫大都自帶數(shù)據(jù)導出功能,如Oracle的exp/expdp程序和MySQL的mysqldump程序,都可以用于生成數(shù)據(jù)文件。
重做日志和歸檔日志。每種數(shù)據(jù)庫系統(tǒng)都有自己的日志格式和解析工具。
(3)變化數(shù)據(jù)捕獲
抽取處理需要重點考慮增量抽取,也被稱為變化數(shù)據(jù)捕獲(Change Data Capture,CDC)。假設(shè)一個數(shù)據(jù)倉庫系統(tǒng),在每天夜里的業(yè)務(wù)低峰時間從操作型源系統(tǒng)抽取數(shù)據(jù),那么增量抽取只需要過去24小時內(nèi)發(fā)生變化的數(shù)據(jù)。變化數(shù)據(jù)捕獲也是建立準實時數(shù)據(jù)倉庫的關(guān)鍵技術(shù)。當能夠識別并獲得最近發(fā)生變化的數(shù)據(jù)時,抽取及其后面的轉(zhuǎn)換、裝載操作顯然都會變得更高效,因為要處理的數(shù)據(jù)量會小很多。遺憾的是,很多源系統(tǒng)很難識別出最近變化的數(shù)據(jù),或者必須侵入源系統(tǒng)才能做到。變化數(shù)據(jù)捕獲是數(shù)據(jù)抽取中典型的技術(shù)挑戰(zhàn)。常用的變化數(shù)據(jù)捕獲方法有時間戳、快照、觸發(fā)器和日志四種。相信熟悉數(shù)據(jù)庫的用戶對這些方法都不會陌生。時間戳方法需要源系統(tǒng)有相應(yīng)的數(shù)據(jù)列表示最后的數(shù)據(jù)變化。快照方法可以使用數(shù)據(jù)庫系統(tǒng)自帶的機制實現(xiàn),如Oracle的物化視圖技術(shù),也可以自己實現(xiàn)相關(guān)邏輯,但會比較復雜。觸發(fā)器是關(guān)系數(shù)據(jù)庫系統(tǒng)具有的特性,源表上建立的觸發(fā)器會在對該表執(zhí)行insert、update、delete等語句時被觸發(fā),觸發(fā)器中的邏輯用于捕獲數(shù)據(jù)的變化。日志可以使用應(yīng)用日志或系統(tǒng)日志,這種方式對源系統(tǒng)不具有侵入性,但需要額外的日志解析工作。關(guān)于這四種方案的特點,將會在本專題(五)數(shù)據(jù)抽取 中具體說明。3. 數(shù)據(jù)轉(zhuǎn)換
數(shù)據(jù)從操作型源系統(tǒng)獲取后,需要進行多種轉(zhuǎn)換操作。如統(tǒng)一數(shù)據(jù)類型、處理拼寫錯誤、消除數(shù)據(jù)歧義、解析為標準格式等等。數(shù)據(jù)轉(zhuǎn)換通常是最復雜的部分,也是ETL開發(fā)中用時最長的一步。數(shù)據(jù)轉(zhuǎn)換的范圍極廣,從單純的數(shù)據(jù)類型轉(zhuǎn)化到極為復雜的數(shù)據(jù)清洗技術(shù)。在數(shù)據(jù)轉(zhuǎn)換階段,為了能夠最終將數(shù)據(jù)裝載到數(shù)據(jù)倉庫中,需要在已經(jīng)抽取來的數(shù)據(jù)上應(yīng)用一系列的規(guī)則和函數(shù)。有些數(shù)據(jù)可能不需要轉(zhuǎn)換就能直接導入到數(shù)據(jù)倉庫。數(shù)據(jù)轉(zhuǎn)換一個最重要的功能是清洗數(shù)據(jù),目的是只有“合規(guī)”的數(shù)據(jù)才能進入目標數(shù)據(jù)倉庫。這步操作在不同系統(tǒng)間交互和通信時尤其必要,例如,一個系統(tǒng)的字符集在另一個系統(tǒng)中可能是無效的。另一方面,由于某些業(yè)務(wù)和技術(shù)的需要,也需要進行多種數(shù)據(jù)轉(zhuǎn)換,例如下面的情況:只裝載特定的數(shù)據(jù)列。例如,某列為空的數(shù)據(jù)不裝載。
統(tǒng)一數(shù)據(jù)編碼。例如,性別字段,有些系統(tǒng)使用的是1和0,有些是‘M’和‘F’,有些是‘男’和‘女’,統(tǒng)一成‘M’和‘F’。
自由值編碼。例如,將‘Male’改成‘M’。
預計算。例如,產(chǎn)品單價 * 購買數(shù)量 = 金額。
基于某些規(guī)則重新排序以提高查詢性能。
合并多個數(shù)據(jù)源的數(shù)據(jù)并去重。
預聚合。例如,匯總銷售數(shù)據(jù)。
行列轉(zhuǎn)置。
將一列轉(zhuǎn)為多列。例如,某列存儲的數(shù)據(jù)是以逗號作為分隔符的字符串,將其分割成多列的單個值。
合并重復列。
預連接。例如,查詢多個關(guān)聯(lián)表的數(shù)據(jù)。
數(shù)據(jù)驗證。針對驗證的結(jié)果采取不同的處理,通過驗證的數(shù)據(jù)交給裝載步驟,驗證失敗的數(shù)據(jù)或直接丟棄,或記錄下來做進一步檢查。
4. 數(shù)據(jù)裝載
ETL的最后步驟是把轉(zhuǎn)換后的數(shù)據(jù)裝載進目標數(shù)據(jù)倉庫。這步操作需要重點考慮兩個問題,一是數(shù)據(jù)裝載的效率,二是一旦裝載過程中途失敗了,如何再次重復執(zhí)行裝載過程。即使經(jīng)過了轉(zhuǎn)換、過濾和清洗,去掉了部分噪聲數(shù)據(jù),但需要裝載的數(shù)據(jù)量還是很大的。執(zhí)行一次數(shù)據(jù)裝載可能需要幾個小時甚至更長時間,同時需要占用大量的系統(tǒng)資源。要提高裝載的效率,加快裝載速度,可以從以下幾方面入手。首先保證足夠的系統(tǒng)資源。數(shù)據(jù)倉庫存儲的都是海量數(shù)據(jù),所以要配置高性能的服務(wù)器,并且要獨占資源,不要與別的系統(tǒng)共用。在進行數(shù)據(jù)裝載時,可以禁用數(shù)據(jù)庫約束(唯一性、非空性,檢查約束等)和索引,當裝載過程完全結(jié)束后,再啟用這些約束,重建索引。這種方法會大幅提高裝載速度。在數(shù)據(jù)倉庫環(huán)境中,一般不使用數(shù)據(jù)庫來保證數(shù)據(jù)的參考完整性,即不使用數(shù)據(jù)庫的外鍵約束,它應(yīng)該由ETL工具或程序來維護。數(shù)據(jù)裝載過程可能由于多種原因而失敗,比如裝載過程中某些源表和目標表的結(jié)構(gòu)不一致而導致失敗,而這時已經(jīng)有部分表裝載成功了。在數(shù)據(jù)量很大的情況下,如何能在重新執(zhí)行裝載過程時只裝載失敗的部分是一個不小的挑戰(zhàn)。對于這種情況,實現(xiàn)可重復裝載的關(guān)鍵是要記錄下失敗點,并在裝載程序中處理相關(guān)的邏輯。還有一種情況,就是裝載成功后,數(shù)據(jù)又發(fā)生了改變(比如有些滯后的數(shù)據(jù)在ETL執(zhí)行完才進入系統(tǒng),就會帶來數(shù)據(jù)的更新或新增),這時需要重新再執(zhí)行一遍裝載過程,已經(jīng)正確裝載的數(shù)據(jù)可以被覆蓋,但相同數(shù)據(jù)不能重復新增。簡單的實現(xiàn)方式是先刪除在插入,或者用replace into、merge into等類似功能的操作。裝載到數(shù)據(jù)倉庫里的數(shù)據(jù),經(jīng)過匯總、聚合等處理后交付給多維立方體或數(shù)據(jù)可視化、儀表盤等報表工具、BI工具做進一步的數(shù)據(jù)分析。5. 開發(fā)ETL系統(tǒng)的方法
ETL系統(tǒng)一般都會從多個應(yīng)用系統(tǒng)整合數(shù)據(jù),典型的情況是這些應(yīng)用系統(tǒng)運行在不同的軟硬件平臺上,由不同的廠商所支持,各個系統(tǒng)的開發(fā)團隊也是彼此獨立的,隨之而來的數(shù)據(jù)多樣性增加了ETL系統(tǒng)的復雜性。開發(fā)一個ETL系統(tǒng),常用的方式是使用數(shù)據(jù)庫標準的SQL及其程序化語言,如Oracle的PL/SQL和MySQL的存儲過程、用戶自定義函數(shù)(UDF)等。還可以使用Kettle這樣的ETL工具,這些工具都提供多種數(shù)據(jù)庫連接器和多種文件格式的處理能力,并且對ETL處理進行了優(yōu)化。使用工具的最大好處是減少編程工作量,提高工作效率。如果遇到特殊需求或特別復雜的情況,可能還是需要使用Shell、Java、Python等編程語言開發(fā)自己的應(yīng)用程序。ETL過程要面對大量的數(shù)據(jù),因此需要較長的處理時間。為提高ETL效率,通常這三步操作會并行執(zhí)行。當數(shù)據(jù)被抽取時,轉(zhuǎn)換進程同時處理已經(jīng)收到的數(shù)據(jù)。一旦某些數(shù)據(jù)被轉(zhuǎn)換過程處理完,裝載進程就會將這些數(shù)據(jù)導入目標數(shù)據(jù)倉庫,而不會等到前一步工作執(zhí)行完才開始。二、ETL工具
1. ETL工具的產(chǎn)生
ETL工具出現(xiàn)之前,人們使用手工編寫程序的方式來完成不同數(shù)據(jù)源的數(shù)據(jù)整合工作,常見的程序語言如COBOL、Perl或PL/SQL等。盡管這種數(shù)據(jù)整合方案由來已久,但直至今天仍有ETL工作使用這種手工編程/腳本的方式來完成。在還沒有太多開源ETL工具的年代,相對價格昂貴的ETL工具而言,手工編程還有一定意義。手工編程的主要缺點在于:容易出錯
開發(fā)周期長
不易于維護
缺少元數(shù)據(jù)
缺乏一致性的日志和錯誤處理
2. ETL工具的功能
下面描述一般ETL工具必備的通用功能,以及Kettle如何提供這些功能。(1)連接
任何ETL工具都應(yīng)該有能力連接到類型廣泛的數(shù)據(jù)源和數(shù)據(jù)格式。對于最常用的關(guān)系型數(shù)據(jù)庫系統(tǒng),還要提供本地的連接方式(如Oracle的OCI),ETL應(yīng)該能夠提供下面最基本的功能:連接到普通關(guān)系型數(shù)據(jù)庫并獲取數(shù)據(jù),如常見的Oracle、MS SQL Server、IBM DB/2、Ingres、MySQL和PostgreSQL等。
從有分隔符或固定格式的ASCII文件中獲取數(shù)據(jù)。
從XML文件中獲取數(shù)據(jù)。
從流行的辦公軟件中獲取數(shù)據(jù),如Access數(shù)據(jù)庫和Excel電子表格。
使用FTP、SFTP、SSH方式獲取數(shù)據(jù)(最好不用腳本)。
(2)平臺獨立
一個ETL工具應(yīng)該能在任何平臺上甚至是不同平臺的組合上運行。例如,一個32位的操作系統(tǒng)可能在開發(fā)的初始階段運行很好,但是當數(shù)據(jù)量越來越大時,就需要一個更強大的64位操作系統(tǒng)。再比如,開發(fā)一般是在Windows或Mac機上進行的,而生產(chǎn)環(huán)境一般是Linux系統(tǒng)或集群,ETL解決方案應(yīng)該可以無縫地在這些系統(tǒng)間切換。Kettle是用Java開發(fā)的,可以運行在任何安裝了Java虛擬機的計算機上。(3)數(shù)據(jù)規(guī)模
ETL解決方案應(yīng)該能處理逐年增長的數(shù)據(jù)。一般ETL能通過下面三種方式處理大數(shù)據(jù)。并發(fā):ETL過程能夠同時處理多個數(shù)據(jù)流,以便利用現(xiàn)代多核的硬件架構(gòu)。
分區(qū):ETL能夠使用特定的分區(qū)模式,將數(shù)據(jù)分發(fā)到并發(fā)的數(shù)據(jù)流中。
集群:ETL過程能夠分配在多臺機器上聯(lián)合完成。
(4)設(shè)計靈活性
一個ETL工具應(yīng)該留給開發(fā)人員足夠的自由度來使用,而不能通過一種固定的方式限制用戶的創(chuàng)造力和設(shè)計的需求。ETL工具可以分為基于過程的和基于映射的?;谟成涞墓ぞ咧辉谠春湍康臄?shù)據(jù)之間提供一組固定的步驟,嚴重限制了設(shè)計工作的自由度。基于映射的工具一般易于使用,可快速上手,但是對于更復雜的任務(wù),基于過程的工具才是最好的選擇。使用像Kettle這樣基于過程的工具,根據(jù)實際的數(shù)據(jù)和業(yè)務(wù)需求,可以創(chuàng)建自定義的步驟和轉(zhuǎn)換。(5)復用性
設(shè)計完的ETL轉(zhuǎn)換應(yīng)該可以被復用,這也是ETL工具的一個不可或缺的特征。復制和粘貼已存在的轉(zhuǎn)換步驟是最常見的一種復用,但這還不是真正意義上的復用。復用一詞是指定義了一個轉(zhuǎn)換或步驟,從其它地方可以調(diào)用這些轉(zhuǎn)換或步驟。Kettle里有一個“映射(子轉(zhuǎn)換)”步驟,可以完成轉(zhuǎn)換的復用,該步驟可以將一個轉(zhuǎn)換作為其它轉(zhuǎn)換的子轉(zhuǎn)換。另外轉(zhuǎn)換還可以在多個作業(yè)里多次使用,同樣作業(yè)也可以作為其它作業(yè)的子作業(yè)。(6)擴展性
ETL工具必須要有擴展功能的方法。幾乎所有的ETL工具都提供了腳本,以編程的方式來解決工具本身不能解決的問題。另外有些ETL工具可以通過API或其它方式來為工具增加組件。第三種方法是使用腳本語言寫函數(shù),函數(shù)可以被其它轉(zhuǎn)換或腳本調(diào)用。Kettle提供了上述所有功能。“JavaScript代碼”步驟可以用來開發(fā)Java腳本,把這個腳本保存為一個轉(zhuǎn)換,再通過映射(子轉(zhuǎn)換)步驟,又可以變?yōu)橐粋€標準的可以復用的函數(shù)。實際上并不限于腳本,每個轉(zhuǎn)換都可以通過這種映射(子轉(zhuǎn)換)方式來復用,如同創(chuàng)建了一個組件。Kettle在設(shè)計上就是可擴展的,它提供了一個插件平臺。這種插件架構(gòu)允許第三方為Kettle平臺開發(fā)插件。Kettle里的所有組件都是插件,即使是默認提供的組件。(7)數(shù)據(jù)轉(zhuǎn)換
ETL項目很大一部分工作都是在做數(shù)據(jù)轉(zhuǎn)換。在輸入和輸出之間,數(shù)據(jù)要經(jīng)過檢驗、連接、分割、合并、轉(zhuǎn)置、排序、歸并、克隆、排重、刪除、替換或者其它操作。常用的ETL工具(包括Kettle)都提供了下面一些最基本的轉(zhuǎn)換功能:緩慢變更維度(Slowly Changing Dimension,SCD)
查詢值
行列轉(zhuǎn)置
條件分割
排序、合并、連接
聚集
(8)測試和調(diào)試
測試和調(diào)試的重要性不言而喻。ETL的設(shè)計過程和直接用開發(fā)語言寫程序很相似,也就是說在寫程序時用到的一些步驟或過程同樣也適用于ETL設(shè)計。測試也是ETL設(shè)計的一部分。為了完成測試工作,我們通常需要假設(shè)下面幾種失敗場景,并要給出相應(yīng)的處理方法:如果ETL過程沒有按時完成數(shù)據(jù)轉(zhuǎn)換的任務(wù)怎么辦?
如果轉(zhuǎn)換過程異常終止怎么辦?
目標是非空列的數(shù)據(jù)抽取到的數(shù)據(jù)為空怎么辦?
轉(zhuǎn)換后的行數(shù)和抽取到的數(shù)據(jù)行數(shù)不一致怎么辦(數(shù)據(jù)丟失)?
轉(zhuǎn)換后計算的數(shù)值和另一個系統(tǒng)的數(shù)值不一致怎么辦(邏輯錯誤)?
(9)血統(tǒng)和影響分析
任何ETL工具都應(yīng)該有一個重要的功能:讀取轉(zhuǎn)換的元數(shù)據(jù),抽取由不同轉(zhuǎn)換構(gòu)成的數(shù)據(jù)流的信息。血統(tǒng)分析和影響分析是基于元數(shù)據(jù)的兩個相關(guān)的特性。血統(tǒng)是一種回溯性的機制,它可以查看到數(shù)據(jù)的來源。例如,“價格”和“數(shù)量”字段作為輸入字段,在轉(zhuǎn)換中根據(jù)這兩個字段計算出“收入”字段。即使在后面的處理流程里過濾了“價格”個“數(shù)量”字段,血統(tǒng)分析也能分析出“收入”字段是基于“價格”和“數(shù)量”字段的。影響分析是基于元數(shù)據(jù)的另種分析方法,該方法可以分析源數(shù)據(jù)字段對隨后的轉(zhuǎn)換以及目標表的影響。在本專題的(十二)Kettle元數(shù)據(jù)管理 中將詳細講述這一主題。(10)日志和審計
數(shù)據(jù)倉庫的目的就是要提供一個準確的信息源,因此數(shù)據(jù)倉庫里的數(shù)據(jù)應(yīng)該是可靠和可信的。為了保證這種可靠性,同時保證可以記錄下所有的數(shù)據(jù)轉(zhuǎn)換操作,ETL工具應(yīng)該提供日志和審計功能。日志可以記錄下在轉(zhuǎn)換過程中執(zhí)行了哪些步驟,包括每個步驟開始和結(jié)束時間時間戳。審計可以追蹤到對數(shù)據(jù)做的所有操作,包括讀行數(shù)、轉(zhuǎn)換行數(shù)、寫行數(shù)。在這方面Kettle在ETL工具市場處于領(lǐng)先地位。傳統(tǒng)大的軟件廠商一般都提供ETL工具軟件,如Oracle的OWB和ODI、微軟的SQL Server Integration Services、SAP的Data Integrator、IBM的InfoSphere DataStage、Informatica等。下面介紹本專題的主角,開源的ETL工具中的佼佼者——Kettle。三、Kettle簡介Kettle是Pentaho公司的數(shù)據(jù)整合產(chǎn)品,它可能是現(xiàn)在世界上最流行的開源ETL工具,經(jīng)常被用于數(shù)據(jù)倉庫環(huán)境,并可用來操作Hadoop上的數(shù)據(jù)。Kettle的使用場景包括:不同數(shù)據(jù)源之間遷移數(shù)據(jù)、把數(shù)據(jù)庫中的數(shù)據(jù)導出成平面文件、向數(shù)據(jù)庫大批量導入數(shù)據(jù)、數(shù)據(jù)轉(zhuǎn)換和清洗、應(yīng)用整合等。Kettle是使用Java語言開發(fā)的。它最初的作者Matt Casters原是一名C語言程序員,在著手開發(fā)Kettle時還是一名Java小白,但是他僅用了一年時間就開發(fā)出了Kettle的第一個版本。雖然有很多不足,但這版畢竟是可用的。使用自己并不熟悉的語言,僅憑一己之力在很短的時間里就開發(fā)出了復雜的ETL系統(tǒng)工具,作者的開發(fā)能力和實踐精神令人十分佩服。后來Pentaho公司獲得了Kettle源代碼的版權(quán),Kettle也隨之更名為Pentaho Data Integration,簡稱PDI。1. Kettle設(shè)計原則
Kettle工具在設(shè)計之初就考慮到了一些設(shè)計原則,這些原則也借鑒了以前使用過的其它一些ETL工具積累下的經(jīng)驗和教訓。易于開發(fā)
避免自定義開發(fā)
所有功能都通過用戶界面完成
沒有命名限制
透明
靈活的數(shù)據(jù)通道
只映射需要的字段
可視化編程
2. 轉(zhuǎn)換
轉(zhuǎn)換(transformation)是Kettle ETL解決方案中最主要的部分,它處理抽取、轉(zhuǎn)換、裝載各階段各種對數(shù)據(jù)行的操作。轉(zhuǎn)換包括一個或多個步驟(step),如讀取文件、過濾輸出行、數(shù)據(jù)清洗或?qū)?shù)據(jù)裝載到數(shù)據(jù)庫等等。轉(zhuǎn)換里的步驟通過跳(hop)來連接,跳定義了一個單向通道,允許數(shù)據(jù)從一個步驟向另一個步驟步驟流動。在Kettle里,數(shù)據(jù)的單位是行,數(shù)據(jù)流就是數(shù)據(jù)行從一個步驟到另一個步驟的移動。
圖1-2所示的轉(zhuǎn)換從數(shù)據(jù)庫讀取數(shù)據(jù)并寫入文本文件。除了步驟和跳,轉(zhuǎn)換還包括了注釋(note)。注釋是一個文本框,可以放在轉(zhuǎn)換流程圖的任何位置。注釋的主要目的是使轉(zhuǎn)換文檔化。
(1)步驟
步驟是轉(zhuǎn)換的基本組成部分,它以圖標的方式圖形化地展現(xiàn),圖1-2中顯示了兩個步驟,“表輸入”和“文本文件輸出”。一個步驟有幾個關(guān)鍵特性:步驟需要有一個名字,這個名字在轉(zhuǎn)換范圍內(nèi)唯一。
每個步驟都會讀寫數(shù)據(jù)行。唯一例外是“生成記錄”步驟,該步驟只寫數(shù)據(jù)。在本專題的(四)建立ETL示例模型 中將看到如何使用“生成記錄”步驟生成日期維度數(shù)據(jù)。
步驟將數(shù)據(jù)寫到與之相連的一個或多個輸出跳(outgoing hops),再傳送到跳的另一端的步驟。對另一端的步驟來說,這個跳就是一個輸入跳(incoming hops),步驟通過輸入跳接收數(shù)據(jù)。
大多數(shù)步驟可以有多個輸出跳。一個步驟的數(shù)據(jù)發(fā)送可以被設(shè)置為輪流發(fā)送或復制發(fā)送。輪流發(fā)送是將數(shù)據(jù)行依次發(fā)給每個輸出跳,復制發(fā)送是將全部數(shù)據(jù)行發(fā)送給所有輸出跳。
在運行轉(zhuǎn)換時,一個線程運行一個步驟或步驟的一份拷貝,如圖1-2中“表輸入”步驟左上角的X4,表示4個線程執(zhí)行該步驟,數(shù)據(jù)行將復制4份。所有步驟的線程幾乎同時運行,數(shù)據(jù)行連續(xù)地流過步驟之間的跳。
(2)轉(zhuǎn)換的跳
跳(hop)就是步驟間帶箭頭的連線,跳定義了步驟之間的數(shù)據(jù)通路。跳實際上是兩個步驟之間的被稱為行級(row set)的數(shù)據(jù)行緩存。行集的大小可以在轉(zhuǎn)換的設(shè)置里定義,Kettle 8.3 默認為10000行。當行集滿了,向行集寫數(shù)據(jù)的步驟將停止寫入,直到行集里又有了空間。當行集空了,從行集讀取數(shù)據(jù)的步驟停止讀取,直到行集里又有可讀的數(shù)據(jù)行。注意,跳在轉(zhuǎn)換里不能循環(huán),因為在轉(zhuǎn)換里每個步驟都依賴于前一個步驟獲取字段。
(3)并行
跳的這種基于行集緩存的規(guī)則允許每個步驟都由一個獨立的線程運行,這樣并發(fā)程度最高。這一規(guī)則也允許以最小消耗內(nèi)存的數(shù)據(jù)流的方式來處理。在數(shù)據(jù)分析中,我們經(jīng)常要處理大量數(shù)據(jù),所以這種并發(fā)低耗內(nèi)存的方式也是ETL工具的核心需求。對于Kettle轉(zhuǎn)換,不可能定義一個步驟在另一個步驟之后執(zhí)行,因為所有步驟都以并發(fā)方式執(zhí)行:當轉(zhuǎn)換啟動后,所有步驟都同時開始,從它們的輸入跳中讀取數(shù)據(jù),并把處理過的數(shù)據(jù)寫到輸出跳,直到輸入跳不再有數(shù)據(jù),就中止步驟的運行。當所有的步驟都中止了,整個轉(zhuǎn)換就中止了。從功能的角度看,轉(zhuǎn)換具有明確的起點和終點。例如,圖1-2里顯示的轉(zhuǎn)換起點是“表輸入”步驟,因為這個步驟生成數(shù)據(jù)行。終點是“文本文件輸出”步驟,因為這個步驟將數(shù)據(jù)寫到文件,而且后面不再有其它節(jié)點。前面關(guān)于步驟并發(fā)執(zhí)行與起點、終點的描述看似自相矛盾,實際上只是看問題的角度不同。一方面,可以想象數(shù)據(jù)沿著轉(zhuǎn)換里的步驟移動,形成一條行頭到尾的數(shù)據(jù)通路。另一方面,轉(zhuǎn)換里的步驟幾乎是同時啟動的,所以不可能判斷出哪個步驟是第一個啟動的步驟。如果想要一個任務(wù)沿著指定的順序執(zhí)行,就要使用后面介紹的“作業(yè)”了。(4)數(shù)據(jù)行
數(shù)據(jù)以數(shù)據(jù)行的形式沿著步驟移動。一個數(shù)據(jù)行是零到多個字段的集合,字段包括這里所列的幾種數(shù)據(jù)類型。String:字符類型數(shù)據(jù)。
Number:雙精度浮點數(shù)。
Integer:帶符號64位長整型。
BigNumber:任意精度數(shù)值。
Date:毫秒精度的日期時間值。
Boolean:取值為true或false的布爾值。
Binary:二進制類型,可以包括圖形、音視頻或其它類型的二進制數(shù)據(jù)。
名稱:行里的字段名應(yīng)該是唯一的。
數(shù)據(jù)類型:字段的數(shù)據(jù)類型。
長度:字符串的長度或BigNumber類型的長度。
精度:BigNumber數(shù)據(jù)類型的十進制精度。
掩碼:數(shù)據(jù)顯示的格式(轉(zhuǎn)換掩碼)。如果要把數(shù)值型(Number、Integer、BigNumber)或日期類型轉(zhuǎn)換成字符串類型就需要用到掩碼,例如在圖形界面中預覽數(shù)值型、日期型數(shù)據(jù),或者把這些數(shù)據(jù)保存成文本或XML格式時。
小數(shù)點:十進制數(shù)據(jù)的小數(shù)點格式。不同文化背景下小數(shù)點符號是不同的,一般是點(.)或逗號(,)。
分組符號(數(shù)字里的分割符號):數(shù)值類型數(shù)據(jù)的分組符號,不同文化背景下數(shù)字里的分組符號也是不同的,一般是逗號(,)或點(.)或單引號(')。
初始步驟:Kettle在元數(shù)據(jù)里還記錄了字段是由哪個步驟創(chuàng)建的,可以讓用戶快速定位字段是由轉(zhuǎn)換里的哪個步驟最后一次修改或創(chuàng)建。
行集里的所有行都應(yīng)該有同樣的數(shù)據(jù)結(jié)構(gòu)。當從多個步驟向一個步驟里寫數(shù)據(jù)時,多個步驟輸出的數(shù)據(jù)行應(yīng)該有相同的結(jié)構(gòu),即字段名、數(shù)據(jù)類型、字段順序都相同。
字段元數(shù)據(jù)不會在轉(zhuǎn)換中發(fā)生變化。字符串不會自動截去長度以適應(yīng)指定的長度,浮點數(shù)也不會自動取整以適應(yīng)指定的精度。這些功能必須通過一些指定的步驟來完成。
默認情況下,空字符串被認為與NULL相等,但可以通過kettle.properties文件中的kettle_empty_string_differs_from_null參數(shù)來設(shè)置。
(5)數(shù)據(jù)類型轉(zhuǎn)換
既可以顯式地轉(zhuǎn)換數(shù)據(jù)類型,如在“字段選擇”步驟中直接選擇要轉(zhuǎn)換的數(shù)據(jù)類型,也可以隱式地轉(zhuǎn)換數(shù)據(jù)類型,如將數(shù)值數(shù)據(jù)寫入數(shù)據(jù)庫的varchar類型字段。這兩種形式的數(shù)據(jù)轉(zhuǎn)換實際上是完全一樣的,都是使用了數(shù)據(jù)和對數(shù)據(jù)的描述。Date和String的轉(zhuǎn)換
表1-1 日期轉(zhuǎn)換例子Numeric和String的轉(zhuǎn)換
表1-2 數(shù)值轉(zhuǎn)換掩碼的例子其它轉(zhuǎn)換
表1-3 其它數(shù)據(jù)類型轉(zhuǎn)換3. 作業(yè)
大多數(shù)ETL項目都需要完成各種各樣的維護任務(wù)。例如,當運行中發(fā)生錯誤,要做哪些操作;如何傳送文件;驗證數(shù)據(jù)庫表是否存在等等。這些操作要按照一定順序完成,就需要一個可以串行執(zhí)行的作業(yè)來處理。一個作業(yè)包括一個或多個作業(yè)項,這些作業(yè)項以某種順序來執(zhí)行。作業(yè)執(zhí)行順序由作業(yè)項之間的跳(job hop)和每個作業(yè)項的執(zhí)行結(jié)果來決定。圖1-3顯示了一個典型的裝載數(shù)據(jù)倉庫的作業(yè)。
(1)作業(yè)項
作業(yè)項是作業(yè)的基本構(gòu)成部分。如同轉(zhuǎn)換的步驟,作業(yè)項也可以使用圖標的方式圖形化展示。但是作業(yè)項有一些地方不同于步驟:步驟的名字在轉(zhuǎn)換中是唯一的,但作業(yè)項可以有影子拷貝(shadow copies),如圖1-3中的“錯誤郵件”。這樣可以把一個作業(yè)項放在多個不同的位置。這些影子拷貝里的信息都是相同的,編輯了一份拷貝,其它拷貝也會隨之修改。
在作業(yè)項之間可以傳遞一個結(jié)果對象(result object)。這個結(jié)果對象里包含了數(shù)據(jù)行,它們不是以流的方式傳遞的,而是等一個作業(yè)項執(zhí)行完了,再傳遞給下一個作業(yè)項。
默認情況下,所有的作業(yè)項都以串行方式執(zhí)行,只是在特殊的情況下以并行方式執(zhí)行。
(2)作業(yè)的跳
如同轉(zhuǎn)換中各步驟之間的跳,作業(yè)的跳是作業(yè)項之間的連接線,它定義了作業(yè)的執(zhí)行路徑。作業(yè)里每個作業(yè)項的不同運行結(jié)果決定了作業(yè)的不同執(zhí)行路徑。對作業(yè)項的運行結(jié)果的判斷如下:無條件執(zhí)行:不論上一個作業(yè)項執(zhí)行成功還是失敗,下一個作業(yè)項都會執(zhí)行。這是一種黑色的連接線,上面有一個鎖的圖標,如圖1-3中 “start”到“傳送數(shù)據(jù)”作業(yè)項之間的連線。
當運行結(jié)果為真時執(zhí)行:當上一個作業(yè)項的執(zhí)行結(jié)果為真時,執(zhí)行下一個作業(yè)項,通常在需要無錯誤執(zhí)行的情況下使用。這是一種綠色連接線,上面有一個對鉤號圖標,如圖1-3中橫向的三個連線。
當運行結(jié)果為假時執(zhí)行:當上一個作業(yè)項的執(zhí)行結(jié)果為假或沒有成功時,執(zhí)行下一個作業(yè)項。這是一種紅色的連接線,上面有一個紅色的叉子圖標。
(3)多路徑和回溯
Kettle使用一種回溯算法來執(zhí)行作業(yè)里的所有作業(yè)項,而且作業(yè)項的運行結(jié)果(真或假)也決定執(zhí)行路徑?;厮菟惴ㄊ且环N深度遍歷:假設(shè)執(zhí)行到了圖里的一條路徑的某個節(jié)點時,要依次執(zhí)行這個節(jié)點的所有子路徑,直到?jīng)]有再可以執(zhí)行的子路徑,就返回該節(jié)點的上一節(jié)點,再反復這個過程。
圖1-4 使用回溯算法串行執(zhí)行多個路徑首先“Start”作業(yè)項搜索所有下一個節(jié)點作業(yè)項,找到了“A”和“C”。
執(zhí)行“A”
搜索“A”后面的作業(yè)項,發(fā)現(xiàn)了“B”。
執(zhí)行“B”。
搜索“B”后面的作業(yè)項,沒有找到任何作業(yè)項。
回到“A”,也沒有發(fā)現(xiàn)其它作業(yè)項。
回到“Start”,發(fā)現(xiàn)另一個要執(zhí)行的作業(yè)項“C”。
執(zhí)行“C”。
搜索“C”后面的作業(yè)項,沒有找到任何作業(yè)項。
回到“Start”,沒有找到任何作業(yè)項。
作業(yè)結(jié)束。
因為作業(yè)可以是嵌套的,除了作業(yè)項有運行結(jié)果,作業(yè)也需要一個運行結(jié)果,因為一個作業(yè)可以是另一個作業(yè)的作業(yè)項。一個作業(yè)的運行結(jié)果,來自于它最后一個執(zhí)行的作業(yè)項。這個例子里作業(yè)的執(zhí)行順序可能是ABC,也可能是CAB,所以不能保證作業(yè)項C的結(jié)果就是作業(yè)的結(jié)果。
作業(yè)里允許循環(huán)。當在作業(yè)里創(chuàng)建了一個循環(huán),一個作業(yè)項就會被執(zhí)行多次,作業(yè)項的多次運行結(jié)果會保存在內(nèi)存里,便于以后使用。
(4)并行執(zhí)行
一個作業(yè)項能以并發(fā)的方式執(zhí)行它后面的作業(yè)項,如圖1-5中的作業(yè)所示。在這個例子里,作業(yè)項A和C幾乎同時啟動。
圖1-5 并行執(zhí)行的作業(yè)項
圖1-6 兩組同時執(zhí)行的作業(yè)項
圖1-7 并行加載作業(yè)作為另一個作業(yè)的作業(yè)項(5)作業(yè)項結(jié)果
作業(yè)執(zhí)行結(jié)果不僅決定了作業(yè)的執(zhí)行路徑,而且還向下個作業(yè)項傳遞了一個結(jié)果對象。結(jié)果對象包括了這里所示的一些信息。一組數(shù)據(jù)行:在轉(zhuǎn)換里使用“復制記錄到結(jié)果”步驟可以設(shè)置這組數(shù)據(jù)行。與之對應(yīng),使用“從結(jié)果獲取記錄”步驟可以獲取這組數(shù)據(jù)行。在一些作業(yè)項里,如“Shell”、“轉(zhuǎn)換”、“作業(yè)”的設(shè)置里有一個選項可以循環(huán)執(zhí)行這組數(shù)據(jù)行,這樣可以通過參數(shù)化來控制轉(zhuǎn)換和作業(yè)。
一組文件名:在作業(yè)項的執(zhí)行過程中可以獲得一些文件名。這組文件名是所有與作業(yè)項發(fā)生過交互的文件的名稱。例如,一個轉(zhuǎn)換讀取和處理了10個XML文件,這些文件名就會保留在結(jié)果對象里。使用轉(zhuǎn)換里的“從結(jié)果獲取文件”步驟可以獲取到這些文件名,除了文件名還能獲取到文件類型?!耙话恪鳖愋褪侵杆械妮斎胼敵鑫募?,“日志”類型是指Kettle日志文件。
讀、寫、輸入、輸出、更新、刪除、拒絕的行數(shù)和轉(zhuǎn)換里的錯誤數(shù)。
腳本作業(yè)項的退出狀態(tài):根據(jù)腳本執(zhí)行后的狀態(tài)碼,判斷腳本的執(zhí)行狀態(tài),再執(zhí)行不同的作業(yè)流程。
4. 數(shù)據(jù)庫連接
Kettle里的轉(zhuǎn)換和作業(yè)使用數(shù)據(jù)庫連接來連接到關(guān)系型數(shù)據(jù)庫。Kettle數(shù)據(jù)庫連接實際是數(shù)據(jù)庫連接的描述,也就是建立實際連接需要的參數(shù)。實際連接只是在運行時才建立,定義一個Kettle的數(shù)據(jù)庫連接并不真正打開一個數(shù)據(jù)庫的連接。各種數(shù)據(jù)庫的行為彼此不同,圖1-8所示的數(shù)據(jù)庫連接窗口里有很多種數(shù)據(jù)庫。
圖1-8?數(shù)據(jù)庫連接窗口(1)一般選項
在數(shù)據(jù)庫連接窗口中主要設(shè)置三個選項:連接名稱:設(shè)定一個在作業(yè)或轉(zhuǎn)換范圍內(nèi)唯一的名稱。
連接類型:從數(shù)據(jù)庫列表中選擇要連接的數(shù)據(jù)庫類型。根據(jù)選中數(shù)據(jù)庫的類型不同,要設(shè)置的訪問方式和連接參數(shù)也不同,某些Kettle步驟或作業(yè)項生成SQL語句時使用的方言也不同。
訪問方式:在列表里可以選擇可用的訪問方式,一般都使用JDBC連接,不過也可以使用ODBC數(shù)據(jù)源、JNDI數(shù)據(jù)源、Oracle的OCI連接(使用Oracle命名服務(wù))等。
主機名:數(shù)據(jù)庫服務(wù)器的主機名或IP地址。
數(shù)據(jù)庫名:要訪問的數(shù)據(jù)庫名。
端口號:默認是選中的數(shù)據(jù)庫服務(wù)器的默認端口號。
用戶名和密碼:連接數(shù)據(jù)庫服務(wù)器的用戶名和密碼。
(2)特殊選項
對于大多數(shù)用戶來說,使用數(shù)據(jù)庫連接窗口的“一般”標簽就足夠了。但偶爾也可能需要設(shè)置對話框里的“高級”標簽的內(nèi)容,如圖1-9所示。
圖1-9?數(shù)據(jù)庫連接窗口中的“高級”標簽支持Boolean數(shù)據(jù)類型:對Boolean(bit)數(shù)據(jù)類型,大多數(shù)數(shù)據(jù)庫的處理方式都不相同,即使同一個數(shù)據(jù)庫的不同版本也可能不同。許多數(shù)據(jù)庫根本不支持Boolean數(shù)據(jù)類型,如Oracle和MySQL,所以默認情況下,Kettle使用一個char(1)字段的不同值(如Y或N)來代替Boolean字段。如果選中了這個選項,Kettle就會為支持Boolean類型的數(shù)據(jù)庫生成正確的SQL方言。
雙引號分割標識符:強迫SQL語句里的所有標識符(如列名、表名)加雙引號,一般用于區(qū)分大小寫的數(shù)據(jù)庫,或者Kettle里定義的關(guān)鍵字列表和實際數(shù)據(jù)庫不一致的情況。
強制轉(zhuǎn)為小寫:將所有表名和列名轉(zhuǎn)為小寫。
強制轉(zhuǎn)為大寫:將所有表名和列名轉(zhuǎn)為大寫。
默認模式名:當不明確指定模式名時默認的模式名。
連接后要執(zhí)行的SQL語句:一般用于建立連接后,修改某些數(shù)據(jù)庫參數(shù),如session級的變量或調(diào)試信息等。
5. 連接與事務(wù)
數(shù)據(jù)庫連接只在執(zhí)行作業(yè)或轉(zhuǎn)換時使用。在作業(yè)里,每一個作業(yè)項都打開和關(guān)閉一個獨立的數(shù)據(jù)庫連接。轉(zhuǎn)換也是如此,但是因為轉(zhuǎn)換里的步驟是并行的,每個步驟都打開一個獨立的數(shù)據(jù)庫連接并開始一個事務(wù)。盡管這樣在很多情況下會提高性能,但當不同步驟更新同一個表時,也會帶來鎖和參照完整性問題。為了解決打開多個數(shù)據(jù)庫連接而產(chǎn)生的問題,Kettle可以在一個事務(wù)中完成轉(zhuǎn)換。在轉(zhuǎn)換設(shè)置對話框的 “雜項”標簽中,設(shè)置“使用唯一連接”,可以完成此功能。當選中了這個選項,所有步驟里的數(shù)據(jù)庫連接都使用同一個數(shù)據(jù)庫連接。只有所有步驟都正確,轉(zhuǎn)換正確執(zhí)行,才提交事務(wù),否則回滾事務(wù)。6. 元數(shù)據(jù)與資源庫
轉(zhuǎn)換和作業(yè)是Kettle的核心組成部分。在介紹Kettle設(shè)計原則時曾經(jīng)討論過,它們可以用XML格式來表示,可以保存在資料庫里,也可以用Java API的形式來表示。它們的這些表示方式,都依賴于這里所列的元數(shù)據(jù)。名字:轉(zhuǎn)換或作業(yè)的名字。不論是在一個ETL工程內(nèi)還是在多個ETL工程內(nèi),都應(yīng)該盡可能使用唯一的名字,這樣在遠程執(zhí)行時或多個ETL工程共用一個資源庫時都會有幫助。
文件名:轉(zhuǎn)換或作業(yè)所在的文件名或URL。只有當轉(zhuǎn)換或作業(yè)是以XML文件的形式存儲時,才需要設(shè)置這個屬性。當從資源庫加載時,不必設(shè)置這個屬性。
目錄:這個目錄是指在Kettle資源庫里的目錄。當轉(zhuǎn)換或作業(yè)保存在資源庫里時設(shè)置,保存為XML文件時不用設(shè)置。
描述:這是一個可選屬性,用來設(shè)置作業(yè)或轉(zhuǎn)換的簡短的描述信息。如果使用了資源庫,這個描述屬性也會出現(xiàn)在資源庫瀏覽窗口的文件列表中。
擴展描述:也是一個可選屬性,用來設(shè)置作業(yè)或轉(zhuǎn)換的詳細描述信息。
數(shù)據(jù)庫資源庫:把所有的ETL信息保存在關(guān)系數(shù)據(jù)庫中。這種資源庫比較容易創(chuàng)建,詳見本專題的(十二)Kettle元數(shù)據(jù)管理。
文件資源庫:在一個文件目錄下定義一個資源庫。因為Kettle使用的是Apache VFS虛擬文件系統(tǒng),所以這里的文件目錄是一個廣泛的概念,包括zip文件、Web服務(wù)、FTP服務(wù)等。
Pentaho資源庫:包含在Kettle企業(yè)版中的一個插件。這種資源庫實際是一個內(nèi)容管理系統(tǒng)(Content Manage System,CMS),它具備一個理想資源庫的所有特性,包括版本控制和依賴完整性檢查。
中央存儲:在一個中心位置存儲所有的轉(zhuǎn)換和作業(yè)。ETL用戶可以訪問到工程的最新視圖。
文件加鎖:防止多個用戶同時修改同一文件。
修訂管理:一個理想的資源庫可以存儲一個轉(zhuǎn)換或作業(yè)的所有歷史版本,以便將來參考。可以打開歷史版本,并查看變更日志。
依賴完整性檢查:檢查資源庫轉(zhuǎn)換或作業(yè)之間的相互依賴關(guān)系,可以確保資源庫里沒有丟失任何鏈接,沒有丟失任何轉(zhuǎn)換、作業(yè)或數(shù)據(jù)庫連接。
安全性:防止未授權(quán)的用戶修改或執(zhí)行ETL作業(yè)。
引用:重新組織轉(zhuǎn)換、作業(yè),或簡單重命名,都是ETL開發(fā)人員的常見工作。要做好這些工作,需要完整的轉(zhuǎn)換或作業(yè)的引用。
7. 工具
Kettle是一個獨立的產(chǎn)品,但它包括了ETL開發(fā)和部署階段用到的多個工具程序,主要包括:Spoon:圖形化工具,用于快速設(shè)計和維護復雜的ETL工作流。
Kitchen:運行作業(yè)的命令行工具。
Pan:運行轉(zhuǎn)換的命令行工具。
Carte:輕量級(大概1MB)Web服務(wù)器,用來遠程執(zhí)行轉(zhuǎn)換或作業(yè)。一個運行有Carte進程的機器可以作為從服務(wù)器,從服務(wù)器是Kettle集群的一部分。
圖1-10?Kettle工具程序框架(1)Spoon
Spoon是Kettle的集成開發(fā)環(huán)境(IDE)。它基于Java SWT提供了圖形化的用戶接口,主要用于ETL的設(shè)計。在Kettle安裝目錄下,有啟動Spoon的腳本,如Windows下的Spoon.bat,類UNIX下的spoon.sh。Windows用戶還可以通過執(zhí)行Kettle.exe啟動Spoon。Spoon的屏幕截圖如圖1-11所示。
圖1-11 Spoon(2)Kitchen和Pan
作業(yè)和轉(zhuǎn)換可以在圖形界面里執(zhí)行,但這只是在開發(fā)、測試和調(diào)試階段。在開發(fā)完成后,需要部署到實際運行環(huán)境中,在部署階段Spoon就很少用到了。部署階段一般需要通過命令行執(zhí)行,并把命令行放到Shell腳本中,并定時調(diào)度這個腳本。Kitchen和Pan命令行工具就是用于這個階段,在實際的生產(chǎn)環(huán)境使用。Kitchen和Pan工具是Kettle的命令行執(zhí)行程序。實際上,Kitchen和Pan只是在Kettle執(zhí)行引擎上的封裝。它們只是解釋命令行參數(shù),調(diào)用并把這些參數(shù)傳遞給Kettle引擎。Kitchen和Pan在概念和用法上都非常相近,這兩個命令的參數(shù)也基本是一樣的。唯一不同的是Kitchen用于執(zhí)行作業(yè),Pan用于執(zhí)行轉(zhuǎn)換。在使用命令行執(zhí)行作業(yè)或轉(zhuǎn)換時,需要重點考慮網(wǎng)絡(luò)傳輸?shù)男阅?。Kettle數(shù)據(jù)流將數(shù)據(jù)作為本地行集緩存。如果數(shù)據(jù)源和目標之間需要通過網(wǎng)絡(luò)傳輸大量數(shù)據(jù),將Kettle部署于源或目標服務(wù)器上會極大提升性能。Kitchen和Pan都通過腳本的方式啟動,在Windows系統(tǒng)下,腳本名稱是Kitchen.bat和Pan.bat,在類UNIX系統(tǒng)下,腳本名稱是Kitchen.sh和Pan.sh。在執(zhí)行這些腳本以及Kettle自帶的其它腳本時,要把Kettle目錄切換為控制臺的當前目錄。類UNIX系統(tǒng)的腳本默認情況下是不能執(zhí)行的,必須使用chmod命令使腳本可執(zhí)行。Kettle用Java語言開發(fā),因此在使用Kettle命令行時需要注意匹配Java版本。例如Kettle8.2.0版本需要JDK 1.8的支持。這樣就能在Spoon的圖形界面下進行設(shè)計開發(fā)調(diào)試,然后用命令行執(zhí)行保存在本地文件或資源庫中的轉(zhuǎn)換或作業(yè),秉承Java程序一次編譯到處運行的理念。下面是一些命令行的例子。Kitchen和Pan的命令行包含了很多參數(shù),在不使用任何參數(shù)的情況下,直接運行Kitchen和Pan會列出所有參數(shù)的幫助信息。參數(shù)的語法規(guī)范為:# 列出所有有效參數(shù)Kettle-home> ./kitchen.sh# 運行一個存儲在文件中的作業(yè)Kettle-home> ./kitchen.sh /file:/home/foo/daily_load.kjb# 運行一個資源庫里的作業(yè)Kettle-home> ./kitchen.sh /rep:pdirepo /user:admin /pass:admin /dir:/ /job:daily_load.kjb# 運行一個存儲在文件中的轉(zhuǎn)換Kettle-home> ./pan.sh -file:/home/mysql/MongoDB_to_MySQL.ktr
[/-]name [[:=]value]參數(shù)以斜線(/)或橫線(-)開頭,后面跟參數(shù)名。大部分參數(shù)名后面都要有參數(shù)值。參數(shù)名和參數(shù)值之間可以是冒號(:)或等號(=),參數(shù)值里如果包含空格,參數(shù)值必須用單引號(')或雙引號(")引起來。作業(yè)和轉(zhuǎn)換的命令行參數(shù)非常相似,這兩個命令的參數(shù)可以分為下面幾類:指定作業(yè)或轉(zhuǎn)換
控制日志
指定資源庫
列出可用資源庫和資源庫內(nèi)容
表1-4 Kitchen和Pan共有的命令行參數(shù)盡管Kitchen和Pan命令的參數(shù)名基本相同,但這兩個命令里的dir參數(shù)和listdir參數(shù)的含義有一些區(qū)別。對Kitchen而言,dir和listdir參數(shù)列出的是作業(yè)的路徑,Pan命令里的這兩個參數(shù)列出的是轉(zhuǎn)換路徑。除了共有的命令行參數(shù)外,Kitchen和Pan自己特有的命令行參數(shù)分別見表1-5、表1-6。
表1-5 Kitchen特有的命令行參數(shù)
表1-6 Pan特有的命令行參數(shù)(3)Carte
Carte服務(wù)用于執(zhí)行一個作業(yè),就像Kitchen一樣。但和Kitchen不同的是,Carte是一個服務(wù),一直在后臺運行,而Kitchen只是運行完一個作業(yè)就退出。當Carte在運行時,一直在某個端口監(jiān)聽HTTP請求。遠程機器客戶端給Carte發(fā)出一個請求,在請求里包含了作業(yè)的定義。當Carte接到了這樣的請求后,它驗證請求并執(zhí)行請求里的作業(yè)。Carte也支持其它幾種類型的請求,這些請求用于獲取Carte的執(zhí)行進度、監(jiān)控信息等。Carte是Kettle集群中一個重要的構(gòu)建模塊。集群可將單個工作或轉(zhuǎn)換分成幾部分,在Carte服務(wù)器所在的多個計算機上并行執(zhí)行,因此可以分散工作負載。關(guān)于Carte以及Kettle集群的配置和使用,詳見本專題的(十一)Kettle集群與數(shù)據(jù)分片。8. 虛擬文件系統(tǒng)
靈活而統(tǒng)一的文件處理方式對ETL工具來說非常重要,所以Kettle支持URL形式的文件名。Kettle使用Apache的通用VFS作為文件處理接口,替用戶解決各種文件處理方面的復雜情況。例如,使用Apache VFS可以選中.zip壓縮包內(nèi)的多個文件,和在一個本地目錄下選擇多個文件一樣方便。表1-7里顯示的是VFS的一些典型的例子。
表1-7 VFS文件規(guī)范的例子四、小結(jié)編程和使用工具是常用的開發(fā)ETL應(yīng)用的方法,而ETL工具又有基于映射和基于引擎之分。面對各種各樣的ETL開發(fā)工具,之所以選擇Kettle主要歸結(jié)為下面幾點原因。最小化編碼工作
極簡的多線程與并發(fā)執(zhí)行
完備的轉(zhuǎn)換步驟與作業(yè)項
完全跨平臺
圖1-12 多文件數(shù)據(jù)導入
圖1-13 “獲取文件名”步驟設(shè)置
圖1-14 “文本文件輸入”步驟的“文件”設(shè)置
圖1-15 “文本文件輸入”步驟的“內(nèi)容”設(shè)置
圖1-16 “文本文件輸入”步驟的“字段”設(shè)置
圖1-17 “表輸出”步驟設(shè)置

版權(quán)聲明:
本文為大數(shù)據(jù)技術(shù)與架構(gòu)整理,原作者獨家授權(quán)。未經(jīng)原作者允許轉(zhuǎn)載追究侵權(quán)責任。編輯|冷眼丶微信公眾號|import_bigdata文章不錯?點個【在看】吧!??


