Kettle學(xué)習(xí)筆記(一):環(huán)境和轉(zhuǎn)換
一、Kettle環(huán)境
上次說(shuō)了kettle的服務(wù)器部署,接下來(lái)就說(shuō)說(shuō)使用過(guò)程中遇到的問(wèn)題。
之前搭建環(huán)境中提到了搭建環(huán)境要求,在后期使用中,發(fā)現(xiàn)JDK的版本也是很重要的。官方給出的開(kāi)發(fā)環(huán)境如下,使用的是JDK11。

二、Kettle的設(shè)計(jì)模式
Kettle共有兩類(lèi)設(shè)計(jì)模式,轉(zhuǎn)換(Transformation)和作業(yè)(Job)。轉(zhuǎn)換用于控制數(shù)據(jù)處理和流轉(zhuǎn),作業(yè)則用于轉(zhuǎn)換集成和流程控制。
在使用Kettle圖形化編輯界面前,需要先對(duì)軟件進(jìn)行啟動(dòng)。在Linux運(yùn)行spoon.sh啟動(dòng),在windows上則運(yùn)行Spoon.bat進(jìn)行啟動(dòng)。
下面就先對(duì)轉(zhuǎn)換(Transformation)的基本用法進(jìn)行介紹。
轉(zhuǎn)換的左側(cè)菜單欄分成兩類(lèi),分別是主對(duì)象樹(shù)和核心對(duì)象。主對(duì)象樹(shù)是當(dāng)前作業(yè)中使用到的相關(guān)組件。核心對(duì)象則是作業(yè)中擁有的全部全部組件。

1)關(guān)于DB連接,這里提幾個(gè)點(diǎn)。
第一、以Mysql為例,連接方式共有三種,這里支持三種方式JDBC、ODBC、JNDI,一般都是用JDBC的方式進(jìn)行連接,這里不再詳細(xì)贅述。后面有時(shí)間再單獨(dú)說(shuō)這三種連結(jié)方式的區(qū)別。

第二、? 數(shù)據(jù)庫(kù)連接創(chuàng)建好后可以右鍵點(diǎn)擊共享,點(diǎn)擊共享后后面的轉(zhuǎn)換都可以直接進(jìn)行選擇。

第三、? 需要在連接選項(xiàng)中增加zeroDateTimeBehavior=convertToNull,這是防止時(shí)間異常導(dǎo)致處理報(bào)錯(cuò)。

?2)轉(zhuǎn)換中擁有大量核心對(duì)象,包括輸入、輸出、流處理、轉(zhuǎn)換、應(yīng)用、流程、腳本等。由于對(duì)象太多就不一一贅述,下面將結(jié)合例子來(lái)說(shuō)下一些常用的核心對(duì)象。
轉(zhuǎn)換的輸入中支持大量方式,常見(jiàn)的輸入方式,包括json、cvs、excel、數(shù)據(jù)庫(kù)連接等都支持。輸出中支持表輸出、插入/更新、excel、json等。
首次,使用的場(chǎng)景是表數(shù)據(jù)的同步,由于有大量歷史數(shù)據(jù)需要同步。選擇表輸入+表輸出。需提前在目標(biāo)庫(kù)中建好相應(yīng)的表,建表時(shí),一定要處理好所有字段必填項(xiàng)和索引。這種情況,也可以通過(guò)navicat等工具轉(zhuǎn)儲(chǔ)成sql在目標(biāo)庫(kù)中執(zhí)行。開(kāi)始我以為直接數(shù)據(jù)庫(kù)寫(xiě)入要比Kettle效率高很多,但是通過(guò)個(gè)人對(duì)比測(cè)試,百萬(wàn)級(jí)的數(shù)據(jù),數(shù)據(jù)庫(kù)直接寫(xiě)入SQL和Kettle工具同步效率相差并不明顯(幾個(gè)小時(shí)的任務(wù),直接寫(xiě)入SQL快2小時(shí),自動(dòng)化情況下效率不明顯)。
??????

表輸入中,編輯數(shù)據(jù)庫(kù)連接,然后獲取SQL查詢語(yǔ)句,展示SQL時(shí),一定要顯示每一個(gè)字段,這樣會(huì)更清晰。在最后一行,記錄數(shù)量限制,測(cè)試階段可以根據(jù)需要拿到的數(shù)據(jù)量調(diào)整,但是一旦正式使用,一定要填寫(xiě)0,否則只會(huì)讀取有限數(shù)據(jù)。另外,可以通過(guò)預(yù)覽查看獲取的數(shù)據(jù)。


表輸出中,編輯數(shù)據(jù)庫(kù)連接,然后選擇目標(biāo)表。關(guān)于提交記錄數(shù)量,默認(rèn)100,在我的環(huán)境中,我測(cè)試過(guò)1000和10000,結(jié)果是1000的效率較高,所以每次提交1000條。其他功能都無(wú)需設(shè)置。
?

這樣,一個(gè)表輸入+一個(gè)表輸出,就完成了一個(gè)基本流程。我有兩個(gè)大表同步都是通過(guò)這樣的方式完成的,一個(gè)數(shù)據(jù)數(shù)量200萬(wàn),一個(gè)數(shù)據(jù)數(shù)量600萬(wàn)。
其次,使用的場(chǎng)景是在歷史數(shù)據(jù)處理完成后的新數(shù)據(jù)同步和歷史數(shù)據(jù)更新。這里選擇表輸入+表輸入+插入/更新組件。這里使用的邏輯是獲取目標(biāo)數(shù)據(jù)表中最新一條數(shù)據(jù)的時(shí)間戳。然后通過(guò)此時(shí)間戳在源數(shù)據(jù)表查詢此時(shí)間后新增和修改的數(shù)據(jù),然后再插入/更新到目標(biāo)數(shù)據(jù)。以下來(lái)詳細(xì)講解步驟。

第一個(gè)表輸入,獲取目標(biāo)表最新時(shí)間戳。這里需要提醒的是,一定要保證數(shù)據(jù)庫(kù)中有數(shù)據(jù),不然獲取記錄為空,會(huì)導(dǎo)致流程失敗。

第二個(gè)表輸入。編輯選擇數(shù)據(jù)庫(kù)連接,然后獲取SQL查詢語(yǔ)句,在最后的位置拼寫(xiě)SQL查詢更新日期。勾選下方替換SQL語(yǔ)句里的變量,然后從步驟插入數(shù)據(jù),選擇前一步的輸入。兩個(gè)組件間需要按shift畫(huà)線連接。

第三個(gè)插入/更新。編輯選擇數(shù)據(jù)庫(kù)連接,點(diǎn)擊瀏覽選擇目標(biāo)表。用來(lái)查詢的關(guān)鍵字選擇ID進(jìn)行對(duì)比,這里ID是表的唯一主鍵。然后在更新字段中獲取全部字段,對(duì)ID選擇不更新,其他字段都進(jìn)行更新。若不執(zhí)行更新,可以勾選提交記錄數(shù)量下的選框。

這樣,一個(gè)表更新的轉(zhuǎn)換就完成了,對(duì)于新增數(shù)據(jù)會(huì)直接進(jìn)行插入,對(duì)于修改數(shù)據(jù),會(huì)進(jìn)行更新。如果表沒(méi)有主鍵和更新日期,目前還沒(méi)有想到有什么好的應(yīng)對(duì)辦法。
環(huán)境和轉(zhuǎn)換基本上就是這樣了,下一次筆記說(shuō)說(shuō)作業(yè)和定時(shí)。