亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

kettle常見問題(一)

系統(tǒng) 1629 0
轉(zhuǎn)載

kettle常見問題(一)

作者: gemini5201314 ??

摘要:本文主要介紹使用kettle設(shè)計一些ETL任務(wù)時一些常見問題,這些問題大部分都不在官方FAQ上,你可以在kettle的論壇上找到一些問題的答案

1.?Join
我得到A 數(shù)據(jù)流(不管是基于文件或數(shù)據(jù)庫),A包含field1 , field2 , field3 字段,然后我還有一個B數(shù)據(jù)流,B包含field4 , field5 , field6 , 我現(xiàn)在想把它們 ‘加’ 起來, 應(yīng)該怎么樣做.
這 是新手最容易犯錯的一個地方,A數(shù)據(jù)流跟B數(shù)據(jù)流能夠Join,肯定是它們包含join key ,join key 可以是一個字段也可以是多個字段。如果兩個數(shù)據(jù)流沒有join key ,那么它們就是在做笛卡爾積,一般很少會這樣。比如你現(xiàn)在需要列出一個員工的姓名和他所在部門的姓名,如果這是在同一個數(shù)據(jù)庫,大家都知道會在一個sql 里面加上where 限定條件,但是如果員工表和部門表在兩個不同的數(shù)據(jù)流里面,尤其是數(shù)據(jù)源的來源是多個數(shù)據(jù)庫的情況,我們一般是要使用Database Join 操作,然后用兩個database table input 來表示輸入流,一個輸入是部門表的姓名,另一個是員工表的姓名,然后我們認(rèn)為這兩個表就可以 ”Join” 了,我們需要的輸出的確是這兩個字段,但是這兩個字段的輸出并不代表只需要這兩個字段的輸入,它們之間肯定是需要一個約束關(guān)系存在的。另外,無論是在做 Join , Merge , Update , Delete 這些常規(guī)操作的時候,都是先需要做一個compare 操作的,這個compare 操作都是針對compare key 的,無論兩個表結(jié)構(gòu)是不是一樣的,比如employee 表和department 表,它們比較的依據(jù)就是employee 的外鍵department_id , 沒有這個compare key 這兩個表是不可能連接的起來的.. 對于兩個表可能還有人知道是直接sql 來做連接,如果是多個輸入數(shù)據(jù)源,然后是三個表,有人就開始迷茫了,A表一個字段,B表一個字段,C表一個字段,然后就連Join操作都沒有,直接 database table output , 然后開始報錯,報完錯就到處找高手問,他們的數(shù)據(jù)庫原理老師已經(jīng)在吐血了。如果是三個表連接,一個sql 不能搞定,就需要先兩個表兩個表的連接,通過兩次compare key 連接之后得到你的輸出,記住,你的輸出并不能代表你的輸入. 下面總結(jié)一下:
1.?單數(shù)據(jù)源輸入,直接用sql 做連接
2.?多數(shù)據(jù)源輸入,(可能是文本或是兩個以上源數(shù)據(jù)庫),用database join 操作.
3.?三個表以上的多字段輸出.

2.?Kettle的數(shù)據(jù)庫連接模式
Kettle的數(shù)據(jù)庫連接是一個步驟里面控制一個單數(shù)據(jù)庫連接,所以kettle的連接有數(shù)據(jù)庫連接 池,你可以在指定的數(shù)據(jù)庫連接里面指定一開始連接池里面放多少個數(shù)據(jù)庫連接,在創(chuàng)建數(shù)據(jù)庫連接的時候就有Pooling 選項卡,里面可以指定最大連接數(shù)和初始連接數(shù),這可以一定程度上提高速度.

3.?transaction
我想在步驟A執(zhí)行一個操作(更新或者插入),然后在經(jīng)過若干個步驟之后,如果我發(fā)現(xiàn)某一個條件成立,我就提交所有的操作,如果失敗,我就回滾,kettle提供這種事務(wù)性的操作嗎?
Kettle 里面是沒有所謂事務(wù)的概念的,每個步驟都是自己管理自己的連接的,在這個步驟開始的時候打開數(shù)據(jù)庫連接,在結(jié)束的時候關(guān)閉數(shù)據(jù)庫連接,一個步驟是肯定不會 跨session的(數(shù)據(jù)庫里面的session), 另外,由于kettle是并行執(zhí)行的,所以不可能把一個數(shù)據(jù)庫連接打開很長時間不放,這樣可能會造成鎖出現(xiàn),雖然不一定是死鎖,但是對性能還是影響太大 了。ETL中的事務(wù)對性能影響也很大,所以不應(yīng)該設(shè)計一種依賴與事務(wù)方式的ETL執(zhí)行順序,畢竟這不是OLTP,因為你可能一次需要提交的數(shù)據(jù)量是幾百 GB都有可能,任何一種數(shù)據(jù)庫維持一個幾百GB的回滾段性能都是會不大幅下降的.

4.?我真的需要transaction 但又不想要一個很復(fù)雜的設(shè)計,能不能提供一個簡單一點的方式
Kettle 在3.0.2GA版中將推出一種新功能,在一個table output 步驟中有一個Miscellaneous 選項卡,其中有一個Use unique connections 的選項,如果你選中的話就可以得到一個transaction 的簡單版,
由于是使用的單數(shù)據(jù)庫連接,所以可以有錯誤的時候回滾事務(wù),不過要提醒一點是這種方式是以犧牲非常大的性能為前提條件的,對于太大的數(shù)據(jù)量是不適合的(個人仍然不建議使用這種方式)

5.?temporary 表如何使用
我要在ETL過程中創(chuàng)建一個中間表,當(dāng)某個條件成立的時候,我要把中間表的數(shù)據(jù)進行轉(zhuǎn)換,當(dāng)另一條件成立的時候我要對中間表進行另一個操作,我想使用數(shù)據(jù)庫的臨時表來操作,應(yīng)該用什么步驟。
首 先從temp 表的生命周期來分,temp分為 事務(wù)臨時表和會話臨時表,前面已經(jīng)解釋過了,kettle是沒有所謂事務(wù)的概念的,所以自然也沒有所謂的事務(wù)臨時表。Kettle的每個步驟管理自己的數(shù) 據(jù)庫連接,連接一結(jié)束,kettle也就自然丟掉了這個連接的session 的handler , 沒有辦法可以在其他步驟拿回這個session 的handler , 所以也就不能使用所謂的會話臨時表,當(dāng)你嘗試再開一個連接的時候,你可以連上這個臨時表,但是你想要的臨時表里面的數(shù)據(jù)都已經(jīng)是空的(數(shù)據(jù)不一定被清除 了,但是你連不上了),所以不要設(shè)計一個需要使用臨時表的轉(zhuǎn)換
之所以會使用臨時表,其實跟需要 ”事務(wù)” 特性有一點類似,都是希望在ETL過程中提供一種緩沖。臨時表很多時候都不是某一個源表的全部數(shù)據(jù)的鏡像,很多時候臨時表都是很小一部分結(jié)果集,可能經(jīng)過了某種計算過程,你需要臨時表無非是基于下面三個特性:
1.?表結(jié)構(gòu)固定,用一個固定的表來接受一部分?jǐn)?shù)據(jù)。
2.?每次連接的時候里面沒有數(shù)據(jù)。你希望它接受數(shù)據(jù),但是不保存,每次都好像執(zhí)行了truncate table 操作一樣
3.?不同的時候連接臨時表用同一個名字,你不想使用多個連接的時候用類似與temp1 , temp2 , temp3 , temp4 這種名字,應(yīng)為它們表結(jié)構(gòu)一樣。
既然臨時表不能用,應(yīng)該如何設(shè)計ETL過程呢?(可以用某種詭異的操作搞出臨時表,不過不建議這樣做罷了)
如 果你的ETL過程比較的單線程性,也就是你清楚的知道同一時間只有一個這樣的表需要,你可以創(chuàng)建一個普通的表,每次連接的時候都執(zhí)行truncate 操作,不論是通過table output 的truncate table 選項,還是通過手工執(zhí)行truncate table sql 語句(在execute sql script 步驟)都可以達到目的(基于上面的1,2 特性)
如果你的ETL操作比較的多線程性,同一時間可 能需要多個表結(jié)構(gòu)一樣并且里面都是為空的表(基于上面1,2,3特性),你可以創(chuàng)建一個 “字符串+序列”? 的模式,每次需要的時候,就創(chuàng)建這樣的表,用完之后就刪除,因為你自己不一定知道你需要多少個這種類型的表,所以刪除會比truncate 好一些。
下面舉個例子怎么創(chuàng)建這種表:
你可以使用某種約定的表名比如department_temp 作為department 的臨時表。或者
把argument 傳到表名,使用 department_${argument} 的語法,
如果你需要多個這種表,使用一個sequence 操作+execute sql script 操作,execute sql script 就下面這種模式
????????? Create table_?? (…………..)
在表的名字上加參數(shù),前面接受一個sequence 或類似的輸入操作.
需 要注意的是這種參數(shù)表名包括database table input 或者execute sql script ,只要是參數(shù)作為表名的情況前面的輸入不能是從數(shù)據(jù)庫來的,應(yīng)為沒有辦法執(zhí)行這種preparedStatement? 語句,從數(shù)據(jù)庫來的值后面的操作是 “值操作” ,而不是字符串替換,只有argument 或者sequence 操作當(dāng)作參數(shù)才是字符串替換. (這一點官方FAQ也有提到)

6.?update table 和execute sql script 里面執(zhí)行update 的區(qū)別
執(zhí)行update table 操作是比較慢的,它會一條一條基于compare key 對比數(shù)據(jù),然后決定是不是要執(zhí)行update sql , 如果你知道你要怎么更新數(shù)據(jù)盡可能的使用execute sql script 操作,在里面手寫update sql (注意源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫在哪),這種多行執(zhí)行方式(update sql)肯定比單行執(zhí)行方式(update table 操作)快的多。
另一個區(qū)別是execute sql script 操作是可以接受參數(shù)的輸入的。它前面可以是一個跟它完全不關(guān)的表一個sql :
select field1, field2 field3 from tableA
后面執(zhí)行另一個表的更新操作:
update tableB set field4 = ? where field5=? And field6=?
??????? 然后選中execute sql script 的execute for each row .注意參數(shù)是一一對應(yīng)的.(field4 對應(yīng)field1 的值,
field5 對應(yīng)field2 的值, field6 對應(yīng)field3 的值)

7.?kettle的性能
kettle本身的性能絕對是能夠應(yīng)對大型應(yīng)用的,一般的基于平均行長150的一條記錄,假設(shè)源數(shù)據(jù)庫,目標(biāo)數(shù)據(jù) 庫以及kettle都分別在幾臺機器上(最常見的桌面工作模式,雙核,1G內(nèi)存),速度大概都可以到5000 行每秒左右,如果把硬件提高一些,性能還可以提升 , 但是ETL 過程中難免遇到性能問題,下面一些通用的步驟也許能給你一些幫助.
盡量使用數(shù)據(jù)庫連接池
盡量提高批處理的commit size
盡量使用緩存,緩存盡量大一些(主要是文本文件和數(shù)據(jù)流)
Kettle 是Java 做的,盡量用大一點的內(nèi)存參數(shù)啟動Kettle.
可以使用sql 來做的一些操作盡量用sql
Group , merge , stream lookup ,split field 這些操作都是比較慢的,想辦法避免他們.,能用sql 就用sql
插入大量數(shù)據(jù)的時候盡量把索引刪掉
盡量避免使用update , delete 操作,尤其是update , 如果可以把update 變成先delete ,? 后insert .
能使用truncate table 的時候,就不要使用delete all row 這種類似sql
合理的分區(qū)
如果刪除操作是基于某一個分區(qū)的,就不要使用delete row 這種方式(不管是delete sql 還是delete 步驟),直接把分區(qū)drop 掉,再重新創(chuàng)建
盡量縮小輸入的數(shù)據(jù)集的大小(增量更新也是為了這個目的)
盡量使用數(shù)據(jù)庫原生的方式裝載文本文件(Oracle 的sqlloader , mysql 的bulk loader 步驟)
盡量不要用kettle 的calculate 計算步驟,能用數(shù)據(jù)庫本身的sql 就用sql ,不能用sql 就盡量想辦法用procedure , 實在不行才是calculate 步驟.
要知道你的性能瓶頸在哪,可能有時候你使用了不恰當(dāng)?shù)姆绞剑瑢?dǎo)致整個操作都變慢,觀察kettle log 生成的方式來了解你的ETL操作最慢的地方。
遠程數(shù)據(jù)庫用文件+FTP 的方式來傳數(shù)據(jù) ,文件要壓縮。(只要不是局域網(wǎng)都可以認(rèn)為是遠程連接)

8.?描述物理環(huán)境
源數(shù)據(jù)庫的操作系統(tǒng),硬件環(huán)境,是單數(shù)據(jù)源還是多數(shù)據(jù)源,數(shù)據(jù)庫怎么分布的,做ETL的那臺機器放在哪,操作系統(tǒng)和硬件 環(huán)境是什么,目標(biāo)數(shù)據(jù)倉庫的數(shù)據(jù)庫是什么,操作系統(tǒng),硬件環(huán)境,數(shù)據(jù)庫的字符集怎么選,數(shù)據(jù)傳輸方式是什么,開發(fā)環(huán)境,測試環(huán)境和實際的生產(chǎn)環(huán)境有什么區(qū) 別,是不是需要一個中間數(shù)據(jù)庫(staging 數(shù)據(jù)庫) ,源數(shù)據(jù)庫的數(shù)據(jù)庫版本號是多少,測試數(shù)據(jù)庫的版本號是多少,真正的目標(biāo)數(shù)據(jù)庫的版本號是多少……. 這些信息也許很零散,但是都需要一份專門的文檔來描述這些信息,無論是你遇到問題需要別人幫助的時候描述問題本身,還是發(fā)現(xiàn)測試環(huán)境跟目標(biāo)數(shù)據(jù)庫的版本號 不一致,這份專門的文檔都能提供一些基本的信息

9.?procedure
為什么我不能觸發(fā)procedure?
這個問題在官方FAQ里面也有提到,觸發(fā)procedure 和 http client 都需要一個類似與觸發(fā)器的條件,你可以使用generate row 步驟產(chǎn)生一個空的row ,然后把這條記錄連上procedure 步驟,這樣就會使這條沒有記錄的空行觸發(fā)這個procedure (如果你打算使用無條件的單次觸發(fā)) ,當(dāng)然procedure 也可以象table input 里面的步驟那樣傳參數(shù)并且多次執(zhí)行.
另外一個建議是不要使用復(fù)雜的procedure 來完成本該ETL任務(wù)完成的任務(wù),比如創(chuàng)建表,填充數(shù)據(jù),創(chuàng)建物化視圖等等.

kettle常見問題(一)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产中文字幕免费观看 | 久热国产视频 | 国产一级特黄aaaa大片野外 | 色婷婷综合久久久久中文一区二区 | 久久久国产99久久国产首页 | 九九热播视频 | 国产特黄一级一片免费 | 亚洲 自拍 另类 制服在线 | 国产福利资源在线 | 四虎网址| 成人免费牛牛在线视频 | japanese成人 | 国产精品一区二 | 999无色码中文字幕 999小视频 | 亚洲一区二区视频 | 日日夜夜爽 | 操操操天天操 | 一本一本久久a久久精品综合 | 99热最新在线观看 | 午夜精品久久久久久久99 | 日本精a在线观看 | 久久久久久久影院 | 91国内视频| 久草视频播放 | 国产精品自在线拍 | 久久综合中文字幕一区二区 | 国产福利视精品永久免费 | 一区二区精品久久 | 99久久爱re热6在播放 | 2021精品综合久久久久 | 美女很黄很黄免费 | 日日摸夜夜爽人人添 | 日韩欧美在线播放视频 | 久久精品无码一区二区日韩av | 日韩最新中文字幕 | 夜色福利久久久久久777777 | 日韩精品中文字幕一区三区 | 久久久噜噜噜www成人网 | 深夜在线网站 | aaa影院 | 中文字幕在线精品视频万部 |