ETL DataStage實(shí)現(xiàn) 崔雪征 cuixuezheng@hotmail.com 另:完整word版請(qǐng)至下載: http://www./thread-1247237-1-6.html 第1章 前言自開始知道數(shù)據(jù)庫(kù),就知道有數(shù)據(jù)倉(cāng)庫(kù)這個(gè)東西,數(shù)據(jù)倉(cāng)庫(kù)中一關(guān)鍵環(huán)節(jié)就是ETL。可是三四年過去了,由于沒有接觸數(shù)據(jù)倉(cāng)庫(kù)這個(gè)東西,對(duì)ETL自然是一知半解,更別提實(shí)現(xiàn)了。從2007年9月份開始,要做數(shù)據(jù)倉(cāng)庫(kù)項(xiàng)目了,接觸了ETL。ETL中要用DS實(shí)現(xiàn),項(xiàng)目中沒有人會(huì),組長(zhǎng)要我一個(gè)月內(nèi),邊工作邊自學(xué)DS,然后給大家講怎么用DS實(shí)現(xiàn)ETL。想起初學(xué)時(shí)的困難和迷惑,和現(xiàn)在一些同學(xué)的疑問,本人從開發(fā)的角度,簡(jiǎn)單介紹一下用DS實(shí)現(xiàn)ETL。由于本人的知識(shí)和經(jīng)驗(yàn)的局限,自然有很多錯(cuò)誤和不足,希望大家指正,共同進(jìn)步,給初進(jìn)入者一個(gè)參考。 適合人群是對(duì)DS實(shí)現(xiàn)ETL不了解,想有一個(gè)大概印象的人。其他人就幫忙補(bǔ)充或者修正一下這個(gè)東東吧! 有很多地方都是從網(wǎng)上或者其他文章上摘抄的,如有不妥,請(qǐng)指出,將會(huì)刪掉。 本文都用DS代替DataStage。 1.1 什么是ETL既然是ETL DS實(shí)現(xiàn),那就首先得介紹一下ETL了,呵呵。ETL即數(shù)據(jù)的抽?。?/span>Extract)、轉(zhuǎn)換(Transform)、裝載(Load),簡(jiǎn)單來講,就是一個(gè)倒數(shù)的過程。原數(shù)據(jù)很難滿足目標(biāo)系統(tǒng)(就是數(shù)據(jù)倉(cāng)庫(kù)或者別的系統(tǒng))的需要,就得對(duì)數(shù)據(jù)進(jìn)行各種各樣的處理了。 1.2 自編程實(shí)現(xiàn)與ETL工具既然是一個(gè)導(dǎo)數(shù)的過程,應(yīng)該不難實(shí)現(xiàn)了,而且工具還得學(xué)習(xí),又那么貴,可為什么還要用工具呢? 試想以下場(chǎng)景: 一、項(xiàng)目中的源就是csv文件,目標(biāo)庫(kù)就只有一個(gè)oracle庫(kù),而且接口數(shù)量不大,數(shù)據(jù)基本沒有什么轉(zhuǎn)換,以后也沒有多少接口增加; 二、項(xiàng)目中的源有多種文件,好多種數(shù)據(jù)庫(kù),接口的數(shù)量很多,數(shù)據(jù)的轉(zhuǎn)換也比較復(fù)雜,以后還有很多接口,很多種源。 當(dāng)然第一種情況,編程就很容易實(shí)現(xiàn),而且如果程序做的不是太爛,性能,可維護(hù)性和可擴(kuò)展性應(yīng)該都不錯(cuò)。那項(xiàng)目上非得要用ETL工具呢,你就用吧,藝多不壓身,呵呵。 第二種情況,編程也可以實(shí)現(xiàn),問題是得有多少人,花多長(zhǎng)時(shí)間,能實(shí)現(xiàn)個(gè)什么程度,它的性能,可維護(hù)性和可擴(kuò)展性如何?如果這些問題都可以確定,OK,那就項(xiàng)目組編程實(shí)現(xiàn)好了。相信,大多數(shù)項(xiàng)目組,特別是給別人做項(xiàng)目的,會(huì)選擇用ETL工具。 現(xiàn)代社會(huì)之所以發(fā)展的這么快,我認(rèn)為主要的就是專業(yè)化分工(扯遠(yuǎn)了)。雖然ETL工具有這樣那樣的缺點(diǎn),但它的技術(shù)門檻比較低,開發(fā)人員可以很容易的上手,做出的東西性能上也不會(huì)差很多,開發(fā),調(diào)試,維護(hù)都可以很容易的在圖形界面上實(shí)現(xiàn)。各種各樣的源和轉(zhuǎn)換工作,都可以用它的組件實(shí)現(xiàn)。相比較之下,這些方面要遠(yuǎn)好于自編程實(shí)現(xiàn)。 1.3 DS可實(shí)現(xiàn)功能做為專業(yè)的ETL工具,DS可實(shí)現(xiàn)的功能自然是ETL中需要完成的功能,它基本上都可以做到。 DS的基礎(chǔ)組件被稱為Stage,它所實(shí)現(xiàn)的功能,大多是通過在圖形界面上拖拉實(shí)現(xiàn)的。DS的基礎(chǔ)Stage分為兩類:Active Stage就是完成數(shù)據(jù)的轉(zhuǎn)換加載等動(dòng)作,Passive Stage就是與數(shù)據(jù)庫(kù)或者文件進(jìn)行連接,然后讓Active Stage完成其他操作。 Passive Stage可以與文本文件,XML文件,幾乎所有的數(shù)據(jù)庫(kù),Web Services, WebSphere MQ和主要的企業(yè)級(jí)應(yīng)用如SAP、Siebel、Oracle 以及PeopleSoft進(jìn)行聯(lián)接。 Active Stage幾乎可以完成SQL所能完成的所有工作,如關(guān)聯(lián),過濾,去重。 Job Sequence可以將基礎(chǔ)JOB聯(lián)接起來,實(shí)現(xiàn)JOB間的依賴,互斥等操作。 再加上DS自帶的Basic語言,可以實(shí)現(xiàn)各種定制Function,也可以在DS Job Job Crontrol中,除可以對(duì)JOB進(jìn)行靈活多樣的控制外,也可以完成大多數(shù)語言實(shí)現(xiàn)的功能。 DS也可以調(diào)用其他語言,如Shell(或DOS),TCL,可以完成DS本身難以完成的任務(wù)。 當(dāng)然,調(diào)度自然不可少,它支持相對(duì)不復(fù)雜的以時(shí)間為主的調(diào)度。 以及相關(guān)的源數(shù)據(jù)的管理,備份恢復(fù),調(diào)試等功能。 第2章 DS入門2.1 DS結(jié)構(gòu)DS是C/S結(jié)構(gòu),由服務(wù)器端和客戶端組成。服務(wù)器端可以裝在Windows,Unix等平臺(tái)上,客戶端只能裝在Windows上??蛻舳税?/span>DS Administrator; DS Manager; DS Designer; DS Director。服務(wù)端包含:DS Engine; MetaData Repository; Package Installer??傮w架構(gòu)見下圖:
2.2 客戶端組件介紹我們開發(fā),自然用得最多的是客戶端,就重點(diǎn)介紹一下客戶端。 2.2.1 DS Administrator主要功能有: 1、添加和刪除項(xiàng)目(Project),一個(gè)項(xiàng)目就相當(dāng)于Oracle數(shù)據(jù)庫(kù)的一個(gè)Schema,各個(gè)對(duì)象都必須屬于特定的項(xiàng)目; 2、License的管理; 3、設(shè)置全局參數(shù)和修改項(xiàng)目中的參數(shù)。項(xiàng)目中用到的通用參數(shù)可以在這里設(shè)置,調(diào)優(yōu)需要修改的參數(shù)也都在這里。 既然功能這么重要,操作時(shí)要慎重喲! 2.2.2 DS Manager主要功能有: 1、察看和修改DS元數(shù)據(jù); 2、導(dǎo)入表定義,不止從數(shù)據(jù)庫(kù)喲; 3、export,import DS Components,其實(shí)也就是DS的備份恢復(fù)功能; 4、創(chuàng)建Routine: Transformer Routine(Parallel Routine,Server Routine),就是在Transformer Stage中調(diào)用的function; Befor-after Job subroutine; Job Control Routine。除了Parallel Job中Transformer Routine需要用C/C++寫外,其他Routine都可以用DS Basic寫,而且大多也是通用的。 5、批量編譯JOB,不用一個(gè)個(gè)的編譯(廢話),記住這一點(diǎn),就不會(huì)像我曾經(jīng)那樣上千個(gè)JOB一個(gè)個(gè)點(diǎn)了。 2.2.3 DS Designer當(dāng)然這個(gè)就是我們開發(fā)DS最主要的工作環(huán)境了。 1、與JOB相關(guān)的開發(fā),編譯,執(zhí)行; 2、Container,包括Local containers和Shared containers,Container就是將具有相同功能和輸入輸出參數(shù)的用幾個(gè)Stage封裝成一個(gè)模塊; 3、新Parallel Stage的創(chuàng)建,就是自定義Stage。 2.2.4 DS Director1、執(zhí)行JOB 2、察看JOB執(zhí)行情況及狀態(tài),JOB調(diào)度,JOB執(zhí)行日志 3、添加、刪除、修改JOB的調(diào)度,對(duì),這里就是大名鼎鼎的調(diào)度,可以在這里實(shí)現(xiàn),可以按照不同時(shí)間調(diào)度。對(duì)了,本人偶爾發(fā)現(xiàn)的小秘密,一個(gè)JOB可以加多個(gè)調(diào)度,而且都起作用的(是不是大家都知道了?)??上恼{(diào)度方式只能滿足一般的應(yīng)用,一些復(fù)雜的調(diào)度,就得我們自己動(dòng)手了。唉!它咋不能做的再?gòu)?qiáng)點(diǎn)呢? 3、刪除JOB,在Designer中也是可以的。 其實(shí)有些功能,不只是在一個(gè)組件中有,在其他組件中也是可以用的。 2.3 JOB注意事項(xiàng)一些初學(xué)時(shí)的注意事項(xiàng): 1、用文件或者數(shù)據(jù)庫(kù)做源時(shí),做好后最好先"View Data"一下,然后再編譯、運(yùn)行。這是出錯(cuò)最多的地方 2、運(yùn)行完之后,一定要在director中看一下日志。大部分錯(cuò)誤都是由于數(shù)據(jù)庫(kù)配置或者文件名稱不對(duì),也可能是定義的列與實(shí)際的列不是完全匹配等引起的。其實(shí)DS的報(bào)錯(cuò)和其他程序的報(bào)錯(cuò)差不多,大多數(shù)是可以看明白是哪些地方,為什么報(bào)錯(cuò)的 3、Server Job對(duì)列的定義要求不嚴(yán),類型長(zhǎng)度短點(diǎn)長(zhǎng)點(diǎn)都無所謂,而Parallel Job長(zhǎng)度必須正確,定義的短了,就會(huì)截?cái)鄶?shù)據(jù);如果中間用到Active Stage,在Active Stage中源和目標(biāo)長(zhǎng)度必須一樣,否則會(huì)報(bào)警告。 4、如果不知道哪個(gè)Stage該怎么用,DS Basic怎么用,可以查看安裝客戶端時(shí)自帶的PDF幫助,這個(gè)應(yīng)該是最詳細(xì)的,在網(wǎng)上很難找到這類的幫助。 第3章 ETL設(shè)計(jì)ETL的設(shè)計(jì)是個(gè)龐大的工程,不同的項(xiàng)目設(shè)計(jì)差別很大。對(duì)于特別簡(jiǎn)單或者特別復(fù)雜的項(xiàng)目,在此不做討論,只討論一些常見的項(xiàng)目中利用DS實(shí)現(xiàn)ETL的設(shè)計(jì)。 ETL一般需要考慮的問題有:接口數(shù)據(jù)的獲取,頻率,數(shù)據(jù)校驗(yàn),接口間及后續(xù)處理的關(guān)聯(lián)關(guān)系,入庫(kù)方式;優(yōu)先級(jí),順序亂序執(zhí)行,出錯(cuò)處理,重傳處理,調(diào)度監(jiān)控等。除了這些問題,可能還會(huì)有個(gè)別數(shù)據(jù)不是格式化數(shù)據(jù),文件格式DS無法識(shí)別,文件標(biāo)識(shí)的時(shí)間與實(shí)際數(shù)據(jù)數(shù)據(jù)時(shí)間不一致等問題。 3.1 設(shè)計(jì)原則3.1.1 簡(jiǎn)單說起來簡(jiǎn)單,做起來難,呵呵。一直以來都追求簡(jiǎn)單,無奈做出來的卻是越來越復(fù)雜,越來越難以讓人明白。不過,始終相信簡(jiǎn)單就是好的,以此做為設(shè)計(jì)和開發(fā)的第一原則。 3.1.2 全面考濾,重點(diǎn)實(shí)現(xiàn)設(shè)計(jì)之前,需要全面考濾ETL要實(shí)現(xiàn)的各種功能。包括源數(shù)據(jù)都有哪些,如何得到,數(shù)據(jù)是如何存儲(chǔ)的,如何調(diào)度,出錯(cuò)如何處理,過了期的數(shù)據(jù)如何處理,整個(gè)ETL過程如何監(jiān)控等。所有這些項(xiàng)下面都有各種各樣的小項(xiàng),每個(gè)小項(xiàng)又是千變?nèi)f化,不可能每項(xiàng)都能想到,即使能想到,也不可能都能設(shè)計(jì)時(shí)考濾進(jìn)去。所以設(shè)計(jì)要把大項(xiàng)盡可能的考濾進(jìn)去,可以用比較容易擴(kuò)展的設(shè)計(jì),包括小項(xiàng)80%的功能。 3.1.3 充分利用各種資源ETL中涉及到好多系統(tǒng),用到很多技術(shù),ETL的設(shè)計(jì)就是要充分利用已有資源的優(yōu)勢(shì)(包括人員,操作系統(tǒng),DS,數(shù)據(jù)庫(kù)等),綜合運(yùn)用,達(dá)到ETL和其他系統(tǒng)最好的結(jié)合。這個(gè)可能要求對(duì)各種資源了解的比較清楚。 3.1.4 層次分明稍復(fù)雜的ETL,涉及到的面就比較多,除需要考濾實(shí)現(xiàn)的難易程度,性能,實(shí)現(xiàn)成本,還得考濾程序的穩(wěn)定性和可擴(kuò)展性。層次分明將是其實(shí)現(xiàn)的一個(gè)重要保證 3.1.5 規(guī)范嚴(yán)明開始時(shí)規(guī)范可能定的不夠詳細(xì),不是很準(zhǔn)確,但是一定得有,而且相關(guān)人員需要知道為什么要這么定。這些規(guī)范可能包括Shell、DS JOB,存儲(chǔ)過程如何命名如何注釋等。也許按照規(guī)范可能開始時(shí)比較費(fèi)事,而且看不到任何的好處,等做的多了,時(shí)間長(zhǎng)了,只要看看規(guī)范或者是程序的注釋部分,就能知道程序?qū)崿F(xiàn)了什么功能,如何實(shí)現(xiàn),而不用一行行的看代碼。 3.2 總體架構(gòu)這里只是ETL的架構(gòu),而不是整個(gè)數(shù)據(jù)倉(cāng)庫(kù)的架構(gòu)。主要的架構(gòu)包括以下部分。這個(gè)圖只是表示大概部分,監(jiān)控可以完成整個(gè)ETL的監(jiān)控,或者是對(duì)部分重要任務(wù)的監(jiān)控。
3.3 調(diào)度ETL,堆在一塊不運(yùn)行也沒什么用,如何能讓它正確的運(yùn)行起來呢?那就是調(diào)度了。 調(diào)度是ETL的靈魂。ETL調(diào)度的設(shè)計(jì),決定了ETL所能實(shí)現(xiàn)的功能以及靈活性,也決定了其他ETL部分工作量的大小。 調(diào)度涉及到的問題主要有優(yōu)先級(jí),順序亂序執(zhí)行,出錯(cuò)處理,重傳處理,調(diào)度監(jiān)控。 優(yōu)先級(jí)就是任務(wù)之間執(zhí)行的先后緊急順序,將DS Job分為幾個(gè)優(yōu)先級(jí),同一優(yōu)先級(jí)或者不同優(yōu)先級(jí)的JOB間有依賴、互斥等關(guān)系。 順序亂序執(zhí)行,順序就是按照時(shí)間的先后順序加載,而亂序則可以不按照時(shí)間順序執(zhí)行,主要是一些高頻率JOB,異常情況不適合人工處理。 出錯(cuò)處理、重傳處理,就是要求整個(gè)ETL支持重做。 調(diào)度監(jiān)控,對(duì)ETL的處理結(jié)果和重要步驟有一個(gè)記錄,有問題時(shí)發(fā)郵件或者短信通知相關(guān)負(fù)責(zé)人。 如果這些都不太復(fù)雜,可以用sequence Job,在調(diào)度的JOB中用Job Control自編程的方式實(shí)現(xiàn)部分任務(wù)執(zhí)行日志的記錄。對(duì)于很復(fù)雜的,sequence Job難以實(shí)現(xiàn)的,可以自己寫調(diào)度程序?qū)崿F(xiàn)(如Shell, Python , Java)。 3.4 E T L這部分是整個(gè)ETL的主要部分,無論是工作量,還是復(fù)雜程度,都是最大的。這部分的實(shí)現(xiàn)很大部分與源數(shù)據(jù),源數(shù)據(jù)與目標(biāo)數(shù)據(jù)數(shù)據(jù)的對(duì)應(yīng)有很大關(guān)系。如果需要做的很簡(jiǎn)單,完全可以一個(gè)JOB搞定,沒有必要分的很細(xì)。如果比較復(fù)雜,可能需要分為E T L三個(gè)步驟或者更多,DS的設(shè)計(jì)也會(huì)在項(xiàng)目中經(jīng)建目錄的方式將其分開,各步驟生成的文件也將以不同的命名方式放在ETL服務(wù)器不同的目錄下。 這部分的處理,盡早將沒用的數(shù)據(jù)過濾,不正確的格式轉(zhuǎn)換等,使得后來的處理盡量少,盡量簡(jiǎn)單。下面有些具體的處理方式,可以在Extract時(shí)做,也可以在Transform中做,load時(shí)就盡量少做些與入庫(kù)不相關(guān)的操作了。執(zhí)行的順序可以是E T L,也可以是E L T,或者是E T L T等。但是做為一個(gè)整體,最好有一致的方式處理,而不是不同的任務(wù)處理方式千變?nèi)f化。 這部分正是DS的強(qiáng)項(xiàng)。 3.4.1 Extract就是從數(shù)據(jù)源獲取數(shù)據(jù)。在數(shù)據(jù)抽取時(shí),盡量將沒用的數(shù)據(jù),不對(duì)的數(shù)據(jù)在抽取時(shí)過濾掉,格式等不符合的轉(zhuǎn)換掉。如果源系統(tǒng)對(duì)自己的性能要求比較高,則用對(duì)源系統(tǒng)打擾盡量少的方式獲取,如db2的export,oracle的exp等方式,然后再做處理。 涉及到的功能主要有: 數(shù)據(jù)范圍過濾,抽取表中所有數(shù)據(jù)或者根據(jù)時(shí)間抽取相應(yīng)數(shù)據(jù) 字段過濾,只抽取需要的字段,不需要的就不用管 條件過濾,根據(jù)抽取條件抽取數(shù)據(jù) 去除回車換行,如果已抽取成文件,字段中的回車換行將很難去掉 除此之外,還有 格式轉(zhuǎn)換,特別是時(shí)間格式,最好是做成統(tǒng)一格式 賦缺省值,對(duì)于空的部分?jǐn)?shù)據(jù),根據(jù)需要賦一個(gè)缺省值 類型變換,如將number類型轉(zhuǎn)換為varchar類型 代碼轉(zhuǎn)換,就是將在不同源系統(tǒng)中同一含義不同的編碼表示轉(zhuǎn)換成統(tǒng)一的編碼表示,如將代表性別“男”的'N','0'轉(zhuǎn)換成'M' 數(shù)值轉(zhuǎn)換,就是度量單位的轉(zhuǎn)換 3.4.2 Transform就是將抽取的數(shù)據(jù),進(jìn)行一定的處理,生成目標(biāo)表所需要的格式,內(nèi)容。 涉及到的處理主要有: 字段合并、拆分:字段合并就是將多個(gè)字段合并成一個(gè)字段;拆分就是將一個(gè)字段拆成多個(gè)字段 數(shù)據(jù)翻譯,就是不同的數(shù)據(jù)集進(jìn)行關(guān)聯(lián),從另一個(gè)數(shù)據(jù)集中得到所需要的部分?jǐn)?shù)據(jù) 數(shù)據(jù)聚合,就是做一些sum,max等操作 數(shù)據(jù)合并,相當(dāng)于數(shù)據(jù)庫(kù)中的merge 行列轉(zhuǎn)換,需要將某些數(shù)據(jù)轉(zhuǎn)換成行,或者是將行轉(zhuǎn)換成列 參照完整性檢查,對(duì)于數(shù)據(jù)中的參照完整性,入庫(kù)前需要進(jìn)行關(guān)聯(lián)等方式檢查其參照完整性 唯一性檢查,對(duì)數(shù)據(jù)進(jìn)行去重操作 3.4.3 Load就是將數(shù)據(jù)入庫(kù),如果前面的處理都做了,就可以直接入庫(kù)了。入庫(kù)的時(shí)候需要考濾: 更新入庫(kù),對(duì)數(shù)據(jù)庫(kù)中的記錄進(jìn)行更新 插入,就是將數(shù)據(jù)直接入庫(kù) 刷新,將表中的數(shù)據(jù)清空,然后入庫(kù) 部分刷新,將表中的部分?jǐn)?shù)據(jù)清除,然后入庫(kù) 由于性能等方面的需要,入庫(kù)前后,可能需要做一些處理,如索引臨時(shí)失效,主外鍵約束臨時(shí)失效等 3.5 過期文件處理接口文件或者是ETL中間處理生成的文件會(huì)越積越多,久而久之,再大的文件系統(tǒng)也會(huì)撐爆,所以就得對(duì)文件進(jìn)行處理了。接口文件或者有些中間生成的文件,過期之后,有些需要?dú)w檔,以供不時(shí)之需,有些就可以直接刪了(這個(gè)我喜歡)。 這部分的處理最好寫個(gè)統(tǒng)一的程序,對(duì)所有過期的文件進(jìn)行處理,當(dāng)需要過期的數(shù)據(jù)時(shí),也方便取回。 3.6 過期數(shù)據(jù)處理同理,數(shù)據(jù)也有一個(gè)生命周期,當(dāng)絕大多數(shù)都用不到時(shí),就需要對(duì)它進(jìn)行處理了,否則性能,管理,存儲(chǔ)都會(huì)是一個(gè)大問題。對(duì)于數(shù)據(jù)量很大的表,就是delete掉那些數(shù)據(jù)耗費(fèi)的時(shí)間也是很驚人的了。還好,各個(gè)數(shù)據(jù)庫(kù)廠商都提供了分區(qū)表這個(gè)東西,detach表分區(qū)還是相當(dāng)快的。當(dāng)然,將表分區(qū),還得考濾管理,維護(hù),性能方面的問題。充分利用數(shù)據(jù)庫(kù)提供的大數(shù)據(jù)量的操作方式,將過期數(shù)據(jù)進(jìn)行歸檔刪除。 做此操作時(shí),盡量將此表的其他相關(guān)操作都停掉,避免產(chǎn)生死鎖或者嚴(yán)重的鎖等待。當(dāng)然,這個(gè)也是一個(gè)程序?qū)崿F(xiàn)好了。 第4章 ETL實(shí)現(xiàn)4.1 總體實(shí)現(xiàn)設(shè)計(jì)完了,那實(shí)現(xiàn)就開始了。設(shè)計(jì)時(shí)可以不關(guān)心具體用什么產(chǎn)品,什么技術(shù),實(shí)現(xiàn)時(shí)就很得關(guān)心這些東西的優(yōu)劣了。 現(xiàn)在得根據(jù)設(shè)計(jì)時(shí)的方式,創(chuàng)建ETL接口文件、臨時(shí)文件、中間文件、程序、日志等的存放方式; DS JOB中用到的參數(shù)的存放,傳遞等等這些問題。再對(duì)需要的程序和DS的東東進(jìn)行開發(fā)。 Job要聯(lián)接數(shù)據(jù)庫(kù),一般都是通過數(shù)據(jù)庫(kù)客戶端的方式,這樣,需要在在Engine下的dsenv文件中配置數(shù)據(jù)庫(kù)客戶端的聯(lián)接方式,同時(shí)在DS用戶(默認(rèn)是dsadm)的.profile文件中進(jìn)行配置。 另外,Scratch目錄存放DS進(jìn)行運(yùn)算時(shí)自己生成的臨時(shí)文件,如果文件很大,進(jìn)行排序等操作時(shí)此目錄會(huì)占用很大的空間。Datasets存放DS Data Sets Stage生成的文件。所以這兩個(gè)目錄需要特別注意。 DS JOB中用到的參數(shù)一般有三種方式:一種是在DS Administrator中定義,在JOB中調(diào)用;另一種方式是在參數(shù)文件或者參數(shù)表中定義,用程序調(diào)用,賦給相應(yīng)的JOB;第三種是將兩者混合使用,基本固定不變的參數(shù)(如ETL根路徑、數(shù)據(jù)庫(kù)用戶名、密碼)在DS Administrator中設(shè)置,經(jīng)常變化的參數(shù)(如接口時(shí)間)在參數(shù)文件或者參數(shù)表中定義。 DS Administrator中定義的參數(shù)如下
4.2 調(diào)度調(diào)度的復(fù)雜程度,決定了調(diào)度的方式。 對(duì)于調(diào)度比較簡(jiǎn)單的,可以用Sequence Job將相關(guān)JOB串聯(lián)起來,不同Sequence Job間的依賴,可以用消息文件或者數(shù)據(jù)庫(kù)記錄的方式,最后直接在Director中配置調(diào)度時(shí)間。而對(duì)于需要記錄執(zhí)行情況日志的,則可以再做一層通用的Job,在此Job的Job Control中,用basic寫通用的方式調(diào)度其下的E T L Job,并將其記錄日志,參數(shù)就是Job的名稱和時(shí)間等。其實(shí)就是此類Job調(diào)用E T L Job,然后再用Sequence Job調(diào)用他們。 而對(duì)于比較復(fù)雜的,就得單獨(dú)開發(fā)獨(dú)立的程序了。可以在配置表中將不同JOB的執(zhí)行時(shí)間,依賴條件,優(yōu)先級(jí),順序亂序執(zhí)行等信息配置進(jìn)去,寫程序(Shell, Python, Java等)根據(jù)不同的情況,按照不同的方式執(zhí)行,調(diào)用DS提供的接口dsJob對(duì)JOB進(jìn)行控制,并將重要的步驟記錄到日志表中。而對(duì)于重傳等操作,可以通過更改日志表中的狀態(tài)來執(zhí)行。配置的JOB可以是E T L Job,也可以是Sequence Job。 4.3 Parallel Job VS Server JobE T L用到的Job有Server Job, Parallel Job, Mainframe Job(專供大型機(jī)上用的),一般情況下就是Server Job, Parallel Job了。從一類Job轉(zhuǎn)到另一類Job,跟從一個(gè)開發(fā)工具轉(zhuǎn)到另一個(gè)開發(fā)工具一樣,讓人感到很陌生。項(xiàng)目中是用Server Job合適,還是Parallel Job合適?以下是他們之間的一個(gè)比較(直接從網(wǎng)上copy的): 1) The basic difference between server and parallel Jobs is the
degree of parallelism. Server Job Stages do not have in built partitoning and
parallelism mechanism for extracting and loading data between different Stages.
除此之外,還有很多細(xì)節(jié)是相差很大的,做時(shí)需要注意。使用時(shí)很簡(jiǎn)單的感覺,Server Job可以很容易的上手,開發(fā)也很快,性能就差一些(就像MySQL);Parallel Job要求很嚴(yán)格,掌握起來有點(diǎn)難,但性能很強(qiáng)勁(就像DB2)。 4.4 JOB和StageServer Job和Paralel Job都是利用各種不同功能的Stage的組合,實(shí)現(xiàn)具體的E T L功能,而Job Sequence則是將Server Job或者Parallel Job或者Job Sequence連接起來,實(shí)現(xiàn)Job間的依賴等。JOB中用到的參數(shù),在DS Administrator中定義的,可以直接引用,在參數(shù)文件或者參數(shù)表中定義的,就得用程序調(diào)用賦給相應(yīng)的JOB了。 數(shù)據(jù)倉(cāng)庫(kù)中用到的事實(shí)表,維表,緩慢變化維,增量,全量等等概念,在DS中沒有直接對(duì)應(yīng)的Stage,和用SQL一樣,需要我們編程實(shí)現(xiàn)相應(yīng)的邏輯。 下面兩個(gè)示例,實(shí)現(xiàn)的功能都是一樣的,都是從文本文件中讀取數(shù)據(jù),進(jìn)行簡(jiǎn)單的字段類型轉(zhuǎn)換后,入庫(kù)。只不過是Parallel Job是入DB2,Server Job是入Oracle。 4.4.1 Parallel Job和Stage一般我們創(chuàng)建一個(gè)Job,大概都是如下的樣子。和寫程序?qū)崿F(xiàn)一樣,我們需要知道源和目標(biāo)是什么,中間做什么處理,然后實(shí)現(xiàn)之。用DS也是一樣,只是將不同的Stage組合起來,實(shí)現(xiàn)相應(yīng)的功能。Job和Stage中還有很多其他的東西,只是用了最經(jīng)常用的功能和Stage進(jìn)行示例。 這個(gè)Job就是先將同一周期的數(shù)據(jù)刪掉,然后從Sequential File Stage中按照定義的接口規(guī)范讀取數(shù)據(jù),在Transformer Stage中對(duì)字段進(jìn)行轉(zhuǎn)換,最后在DB2 Stage中將其入庫(kù)。
其他復(fù)雜的Job也大概是這樣,也都是按照實(shí)現(xiàn)的功能,將不同的Stage組合起來。 Job中用到的參數(shù)都是在Job Properties中定義的,另外一些通用的功能(執(zhí)行前對(duì)一些文件的處理)也是在這里實(shí)現(xiàn)的
Parallel Job和Server Job這方面基本上是一樣的。接下來,就按照順序一個(gè)一個(gè)Stage大概說一下。先看一下Sequential File Stage
配置好文件路徑和其他參數(shù)后,就View Data一下,好多錯(cuò)誤都是因?yàn)榕渲貌粚?duì)引起的。文本文件的操作,都是用Sequential File Stage。對(duì)于中間用到的文件,可以用Data Set Stage,這個(gè)是DS內(nèi)部實(shí)現(xiàn)的,性能很好。 讀到數(shù)據(jù)后,就用Transformer執(zhí)行類型轉(zhuǎn)換、源和目標(biāo)的字段映射等。ETL中用到的源和目標(biāo)字段的對(duì)應(yīng)關(guān)系,都是通過Active Stage以“拉線”的方式實(shí)現(xiàn)的。沒有辦法在參數(shù)表中定義好,在此引用。倒是可以用文檔記錄不同的源和目標(biāo)之間的映射關(guān)系。整個(gè)E T L,也都是用Passive 讀到數(shù)據(jù)后,用不同的Active Stage組合,實(shí)現(xiàn)關(guān)聯(lián)、去重、轉(zhuǎn)換等。
其中字段LAST_UPD_TIME和CYCLE_TIME是我們?cè)?/span>ETL中用到的,LAST_UPD_TIME表示這批數(shù)據(jù)的實(shí)際入庫(kù)時(shí)間,CYCLE_TIME表示這一批數(shù)據(jù)的數(shù)據(jù)時(shí)間,當(dāng)然根據(jù)項(xiàng)目需要,可以添加其他的字段來標(biāo)示。對(duì)于增量的Job,每次執(zhí)行前都是先將同一CYCLE_TIME的數(shù)據(jù)刪掉,然后入庫(kù),這樣做就是為了支持重做。對(duì)于全量JOB,都是將表中的數(shù)據(jù)Truncate掉,然后入庫(kù)。 處理完后,就可以入庫(kù)了
與DB2相關(guān)的Stage在Parallel Job中也有三個(gè): DB2/UDB Enterprise, DB2/UDB API, DB2/UDB Load,默認(rèn)的是DB2/UDB Enterprise,它是用DB2客戶端的方式與DB2數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行聯(lián)接,充分利用DB2實(shí)現(xiàn)的特有功能,性能很好,是大數(shù)據(jù)量操作的首選。這個(gè)Job是增量入庫(kù),所以在執(zhí)行前,在Open Command中執(zhí)行了刪除操作。 注:用Sequential File做為源時(shí),在Parallel Job中必須有拒絕文件。 4.4.2 Server Job和Stage這個(gè)Server Job實(shí)現(xiàn)的功能與上面的Parallel Job實(shí)現(xiàn)的功能完全一樣。但是具體到Stage,雖然名稱一樣,里面的配置方式和可選項(xiàng)卻是大不一樣。接下來我們就領(lǐng)略一下。先看一下整體風(fēng)貌
基本一樣,就是少了一個(gè)拒絕文件,這是因?yàn)樵?/span>Server Job中Sequential File做為源時(shí),不用拒絕文件。Job Properties中的功能和配置方式基本一樣,就不羅嗦了。首先,我們先打開Sequential File,這有什么呀,還能和Parallel Job中不一樣?
不是吧,是不是搞錯(cuò)了?很不幸,沒有搞錯(cuò)。在接下來的幾個(gè)Stage中你也會(huì)發(fā)現(xiàn)相差很大。在Parallel Job中,Stage的參數(shù)比較多,除了默認(rèn)的幾個(gè)外,還有些備選的,而且都是以文字的形式,一列排下來的,而在Server Job中,參數(shù)比較少,都以上面的方式在面板上排放。下面是Format的選項(xiàng),可以選擇的很少,比較簡(jiǎn)單吧
再看一看Transformer,是不是也變得不認(rèn)識(shí)了
好像沒有變,是樣子沒變,和Parallel Job的功能相差很大。在Server Job中,相對(duì)于Parallel Job Stage就少多了,那這些缺少的功能是怎么實(shí)現(xiàn)的呢?基本是用Transformer實(shí)現(xiàn)的,而Parallel Job中的Transformer的功能倒是相對(duì)比較少。 下面就再看看入庫(kù)的Oracle Stage,在Server Job中沒有Oracle Enterprise,也沒有DB2 Engterprise,性能上要大大縮水了。 Oracle Stage與Sequential File Stage風(fēng)格一樣,習(xí)慣了一個(gè),另一個(gè)也就習(xí)慣了。
刪除的操作,也得放在“SQL”中的“Before”中了,功能同Parallel Job DB2 Enterprise中的“Open Command”了。另外,可以在“Generated”中看到生成的入庫(kù)的SQL,可以據(jù)此判斷配置的是否正確。
上面用了兩個(gè)最簡(jiǎn)單的JOB做了示例,從示例中可以看到,Server Job與Parallel Job的實(shí)現(xiàn)方式基本一樣,只不過他們用到的Stage的“長(zhǎng)相”相差比較大。另外,Parallel Job中有多得多的Stage可以選擇,用他們的組合可以實(shí)現(xiàn)很復(fù)雜,很強(qiáng)大的功能,前提是對(duì)這些Stage的能力,優(yōu)缺點(diǎn)有個(gè)清楚的認(rèn)識(shí)。不過,剛開始時(shí),可以只熟悉一些常用的Stage,然后用時(shí)再考慮。 這些Stage將功能都進(jìn)行了封裝,除了那些選項(xiàng)外,其他的不能添加、修改,其靈活性就差一些。一旦讀到數(shù)據(jù),無論是從數(shù)據(jù)文件還是從數(shù)據(jù)庫(kù)中讀到的,其操作方式就完全一樣了,不用關(guān)心數(shù)據(jù)來自哪里。 上面這兩個(gè)示例都是實(shí)現(xiàn)了很基本的功能,對(duì)于稍復(fù)雜的ETL,可能需要每一步都分成一個(gè)JOB,而不同的JOB間的關(guān)系可能會(huì)有依賴,互斥等,這些關(guān)系如何處理?這就用到了Job Sequence。Job Sequence也是用Stage將Parallel Job、Server Job等聯(lián)接起來,再加上其他的Stage,就可以實(shí)現(xiàn)滿足哪些條件開始執(zhí)行,哪些JOB執(zhí)行完成功或者失敗之后,其他相關(guān)JOB才能執(zhí)行,以及循環(huán)操作等功能。而且Job Sequence可以再調(diào)用Job Sequence,將其合理的組合,就可以比較好的實(shí)現(xiàn)ETL。 4.5 Stage權(quán)衡取舍術(shù)業(yè)有專攻,DS提供了這么多的Stage,都是專于某類特定功能的,所以我們需要記住常用Stage的適用范圍。常用Stage的適用范圍和用法,詳見聯(lián)想網(wǎng)盤à文檔下的《DataStage學(xué)習(xí)文檔.doc》中的“常用組件使用方法” 4.6 性能優(yōu)化這個(gè)范圍很廣,就說點(diǎn)最常用的也是最廢話也是很容易忽視的東西,: 1、盡早將沒用的數(shù)據(jù)過濾掉,包括數(shù)據(jù)范圍和字段等,無論是用DS還是數(shù)據(jù)庫(kù)的存儲(chǔ)過程。 2、用最合適的Stage,如Join Stage和Lookup Stage,Database Plug-in和ODBC,Sequentional file和DataSet功能很相近,某些情況下一種很合適,另一種用不了,或者是性能相差幾十甚至上百倍。 3、充分應(yīng)用操作系統(tǒng),DS,數(shù)據(jù)庫(kù)和自編程序的優(yōu)勢(shì),如果硬件資源豐富,可以大量的應(yīng)用并行化(DS的,數(shù)據(jù)庫(kù)的,自編程序的多進(jìn)程,多線程等),如果資源本來就很稀缺,就千萬別用什么并行化的方式,會(huì)導(dǎo)致性能嚴(yán)重下降。 4、不要過早優(yōu)化。說的人很多,我也不清楚啥意思,知道的幫我補(bǔ)充一下。 具體且有用的優(yōu)化方式詳見聯(lián)想網(wǎng)盤à文檔下的《DataStage學(xué)習(xí)文檔.doc》中的“性能調(diào)優(yōu)”。 第5章 ETL維護(hù)5.1 自編程序的維護(hù)把最新且正確的shell,存儲(chǔ)過程,DS Basic等程序放在CVS,或者SVN上,這個(gè)都知道,只是做起來很難,自勉。 5.2 DS維護(hù)有大的JOB變動(dòng),就導(dǎo)出一份,最好別放在DS服務(wù)器上。雖然服務(wù)器很健壯,但99.9%的努力也許就是為了可能的0.1%。 附錄I. 幫助 首先也是最重要的,就是打開的DS窗口中,按F1就出來的幫助,還有自帶的PDF的文檔,最全的,也是最權(quán)威的。 適合新手的, http://dazheng.360doc.com 目錄“DW-->tools”下本人收集的幾篇入門級(jí)的文章。系統(tǒng)學(xué)習(xí)DS就是IBM出的紅皮書《IBM InfoSphere DataStage Data Flow and Job Design》,也在聯(lián)想網(wǎng)盤中。 遇到問題,不知道如何解決的,可以上DS MSN 群:group214752@xiaoi.com或者是到論壇:http://www./list.html 討論。 聯(lián)想網(wǎng)盤:http://www.在首頁,點(diǎn)左下角的"原測(cè)試版登錄",進(jìn)去后輸入“登錄郵箱/密碼”: cuixuezheng@hotmail.com/group214752 。軟件和文檔都是從網(wǎng)上找到的,僅供學(xué)習(xí)用。 附錄II. DS Job狀態(tài) 無論是在Job Control中用Basic調(diào)用JOB,或者是自己寫的調(diào)度程序,都需要知道DS JOB的狀態(tài)。以下是DS JOB常用的一些狀態(tài)
在用的過程中,發(fā)現(xiàn)我們正在運(yùn)行的JOB的狀態(tài)返回值有時(shí)為空,不知道是不是那個(gè)版本軟件的BUG。 |
|