Kettle日常使用匯總整理
Kettle源碼下載地址:
https://github.com/pentaho/pentaho-kettle
Kettle軟件下載地址:
https://sourceforge.net/projects/pentaho/files/Data%20Integration
kettle-plugin源碼下載地址:
kettle-big-data-plugin源碼下載地址:
https://github.com/pentaho/big-data-plugin
Kettle幫助文檔下載地址:
一、如何將kettle部署到linux中去:(以root用戶操作為例)
1、將window中正常使用的kettle的data-integration文件夾壓縮成tar包;
2、將tar包上傳到linux的指定文件夾中去;
3、利用tar命令將tar包進行解壓;
4、運行./kitchen.sh命令,出現options內容,表示部署正常:
5、將連接數據庫的驅動jar包換到對應的linux文件夾中,不然會連接不到數據庫;
6、通過以上步驟,就可以完成對kettle在linux上的部署工作;
二、如何在Linux上登錄kettle的文件資源庫或數據庫資源庫:
說明:在window中可以通過可視化界面來登錄kettle的資源庫,在linux中沒有可視化界面,windows中kettle的資源庫信息是存儲在一個配置文件中的,只需要將該配置文件上傳到linux中指定文件位置即可,在執行某個轉換或作業的時候,在命令中輸入相應的資源庫即可;
1、找到window中存儲kettle資源庫信息的配置文件:
2、如果是文件庫資源庫,那么需要修改該配置文件中文件的路徑:
3、如果是數據庫資源庫,那么不需要修改任何內容;
4、將該配置文件上傳到linux中部署kettle用戶文件下隱藏的.kettle文件夾下,本人是利用root用戶部署的,因此放在/root/.kettle文件夾下即可:
5、通過以上幾步,可以完成kettle資源庫從window遷移到linux上;
三、Window中kettle的文件資源庫如何在linux中執行:
1、首先要完成kettle中作業或轉換所在的資源庫遷移到linux上;
2、將需要執行的轉換或作業文件遷移到linux中指定的文件資源庫中去;
3、如果轉換中還有數據庫連接,那么需要將存儲有數據庫連接的配置文件也上傳到linux上:(.kdb格式文件就是數據庫配置文件)
4、然后登錄linux,進入到Kettle的data-integration文件夾下,就可以通過百度linux kettle 命令行 ktr/job進行執行了。
命令例子:
四、Window中kettle的數據庫資源庫如何在linux中執行:
1、首先,完成對window中登錄數據庫資源庫配置文件上傳到Linux中對應的位置;
2、然后登錄linux,進入到Kettle的data-integration文件夾下,就可以通過百度linux kettle 命令行 ktr/job進行執行了。
命令例子:
五、Kettle文件資源庫與數據庫資源庫內容如何轉換:
1、文件資源庫導入到數據庫資源庫:
(1)首先,在kettle軟件中登錄到數據庫資源庫;
(2)然后,文件---從xml文件中導入,選擇自己要導入的作業或轉換,然后ctrl+s保存即可;
2、數據庫資源庫導入到文件資源庫:
(1)首先,在kettle軟件中登錄到數據庫資源庫;
(2)然后,文件---導出-----導出到xml文件即可;
六、Kettle連接不同數據庫驅動jar包放置位置:
Kettle軟件部署在不同操作系統中,連接各種數據庫的驅動jar包防止的位置是不同的,與操作系統有關,不同的操作系統上,驅動jar包放在對應的文件夾中即可,如下圖:
七、kettle實現的功能:
kettle可以實現從不同數據源(excel、數據庫、文本文件等)獲取數據,然后將數據進行整合、轉換處理,可以再將數據輸出到指定的位置(excel、數據庫、文本文件)等;
通過kettle處理大量數據非常方便,如果window服務器或者Linux服務器硬件一般情況下,對於處理千萬級一下的數據都是可以的;
八、Kettle作業與轉換如何配合使用:
1、一個作業相當於一個主要任務項,在這個主線中可以調用其它若干個轉換,每個轉換中可以從作業這個主線中獲取數據,然后將數據進行相應的處理操作,再將數據傳遞給作業主線,也可以在轉換中單獨獲取數據------處理數據------輸出數據;
2、並且如果對於需要設置變量的情況下,一般也是需要用到作業與轉換的配合使用,因為變量在當前線中設置,不能再當前線中獲取,需要到下一個線中才能夠獲取;
3、一個任務只能夠有一個主作業,但是可以有多個子作業,主作業中可以調用轉換,也可以調用子作業,具體是調用轉換還是調用子作業,需要根據不同的需求,進行不同的定制;
九、Kettle中設置編碼格式:
如果處理的數據中有中文,需要對中文設置編碼格式,一般是utf8格式,徹底的修改格式的方法就是,修改spoon.bat文件中增加如下信息:"-Dfile.encoding=UTF-8";
十、Kettle中調整運行性能:
Kettle默認的性能適用於普通的一般硬件,如果自己的電腦硬件比較好(內存比較大),可以對kettle的spoon.bat中的參數進行修改,這樣可以適當的提高kettle的運行性能,主要是修改-Xms、-Xmx、-XX:MaxPermSize三個參數的值:
-Xms:設置JVM初始內存 ;
-Xmx:設置JVM最大可用內存 ;
-XX:MaxPermSize:設置JVM最大允許分配內存,按需分配;
非常注意:
1、 -Xmx必須小於等於系統內存的1/4,要不然會報錯,其他兩個選項不大於-Xmx ;
2、當系統內存為4G時-Xmx不能大於1G,當系統內存為8G或更大時,java版本必須是64位的才能識別出來,此時-Xmx可以為2G或更高
自己配置的信息:window服務器內存8G:
-XX:MaxPermSize = -Xmx = 4096m;
-Xms = 1024m
十一、Kettle中常用的控件:
(1)作業中常用控件:
1、通用——START:作業開始;
2、通用——作業:指定某個作業循環執行;
3、通用——轉換:指定某個轉換,加入到作業中來;
4、通用——設置變量:設置變量,為了轉換或者作業中獲取變量;
5、通用——成功:作業完成操作;
6、通用——DUMMY:空操作,什么也不執行;
7、郵件——發送郵件:給指定郵箱發送郵件,發件人的賬號需要開通第三方發送郵件的功能;
8、文件管理——復制/移動結果文件:復制/移動文件;
9、文件管理——創建一個目錄:創建指定的目錄;
10、文件管理——刪除一個文件:刪除指定的一個文件;
11、文件管理——復制文件:復制指定的文件;
12、文件管理——刪除目錄:刪除指定的目錄;
13、文件管理——刪除多個文件:通過正則表達式批量刪除文件;
14、條件——檢查數據庫連接:檢查數據庫是否能夠連接通;
15、條件——檢查表是否存在:檢查指定的表是否存在;
16、文件傳輸——SFTP下載:可以通過SSH進行遠程下載文件;
17、文件傳輸——SFTP上傳:可以通過SSH進行遠程上傳文件;
18、文件傳輸——FTP刪除:可以遠程刪除指定的文件;
(2)轉換中常用控件:
1、輸入——Excel輸入:從excel文件中讀取數據;
2、輸入——文本文件輸入:從文本文件中讀取數據;
3、輸入——生成隨機數:用來生成指定類型的隨機數;
4、輸入——自定義數據常量:將值不變的變量存入到此處,方便管理;
5、輸入——獲取系統信息:可以獲取系統信息(日期、命令行參數);
6、輸入——表輸入:從數據庫表中讀取數據;
7、輸出——Excle輸出:注意.xls格式輸出行數有限制,一般輸出.xlsx最好;
8、輸出——插入/更新:根據指定的匹配字段,可以檢測是插入新數據,還是修改舊數據;
9、輸出——文本文件輸出:將結果數據輸出到文本文件中去;
10、輸出——表輸出:將結果數據輸出到某個數據庫的某個表中;
11、轉換——增加常量:在原數據中將常量值增加新一列;
12、轉換——排序記錄:對原數據按照某個字段進行排序;
13、轉換——剪切字符串:對字符串進行截圖;
14、轉換——去重復記錄:對於某個字段有重復的記錄進行過濾;
15、轉換——字段選擇:篩選流中的字段,慎用,過濾后后面的控件將無法獲取流中篩除的字段了;
16、流程——空操作:將不需要的數據放到此處,類似垃圾箱;
17、流程——過濾記錄:按照條件進行過濾,類似if-else;
18、流程——Switch/Case:與java中switch/case一樣;
19、腳本——java代碼:執行java代碼;
20、腳本——javascript代碼:執行javascript代碼;
21、腳本——執行SQL腳本:執行sql;
22、連接——記錄集連接:類似於sql的left join/right join/inner join,但是使用前的數據必須要經過排序;
23、作業——從結果獲取記錄:從作業中獲取數據;
24、作業——復制記錄到結果:將轉換中的結果數據放到作業中去;
25、作業——獲取變量:從作業中獲取變量;
26、作業——設置變量:設置變量,從而讓作業中能夠獲取變量;
十二、Kettle中javascript腳本執行:
在javascript腳本中可以直接定義變量,可以直接從上一個控件中獲取值,獲取值的方法直接寫前一個控件中某列的列明就好,定義的變量在后續的控件中都可以直接獲取:
十三、Kettle中常用的功能代碼:
1、javascript生成uuid的代碼:
var uuid = replace(java.util.UUID.randomUUID(),"_","");
2、Javascript截取前一個控件中某個字段的長度,獲取另外一個變量:
var choice = substr(tydm,0,4);
0:開始截取的角標;4:表示截取的長度;
十四、Kettle中常見的異常處理:
1、異常類型:java.lang.stackOverFlowError
原因:棧溢出,可能是在處理的數據比較大,棧默認值不夠使用了;
解決方法:修改kettle中的啟動項spoon.bat中的信息,添加一個Xss=1024m即可解決,如果還不夠,可根據硬件來適當增加值;
2、中文輸出亂碼問題:
設置編碼格式,具體操作上述有步驟;
3、連接不上數據庫,報java.lang.NullPointerException異常:
原因:kettle中放置的連接數據庫的驅動jar包版本低於要連接的數據庫版本;
解決方法:首先查看自己要連接的數據庫版本,然后選擇驅動jar包版本要對應或者高於但要最接近於數據庫版本的jar包即可解決;
4、啟動kettle:Prepared statement contains too many placeholders
表輸出每次提交的設置數量太高了,降低每次輸出數量即可解決問題;
5、正常運行一會突然報錯:Communications link failure
錯誤一:
java.net.SocketException: Connection reset by peer: socket write error
錯誤二:
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.
產生上述兩個錯誤的原因:可能是kettle默認使用的是服務端提供的statement,因為一些原因服務端可能會關閉statement,因此要對連接的數據庫設置一些參數,使用kettle自身提供的statement就可以
(1)解決問題:設置參數如下:
useServerPrepStmts=false
rewriteBatchedStatements=true
useCompression=true
(2)如果使用連接池,並將連接池總的maxIDle數值設的比較大:
(3)對數據庫中的net_write_timeout和net_read_timeout設置大點,即修改my.cnf配置文件中參數值的大小,如果沒有該參數,自己增加即可:
如果還是報錯,可能是服務器性能不好,稍等一會或者第二天再嘗試,就可能好了。
(4)如果數據量多,請求有修改,可能是鎖了sql了,需要將innodb_lock_wait_timeout值設置大點,如果數據量特別大,那就值更大點。就可以解決問題了。
6、運行速度慢,卡,解決方法是:增加內存:
(1)JAVAMAXMEM:為物理內存的1/4,如果物理內存在16g以上,最大可以嘗試1/2;
(2)Xms和Xmx:等於JAVAMAXMEM的大小;
(3)Xmn:為xmx的3/8
(4)Xss:一般1024夠了,主要是防止StackOverFlowError出現的。
7、多張表關聯插入時,報:Unable to write value data to output stream,No space left on device:(臨時文件輸出到指定地方,該地方磁盤空間不夠)
解決方法:
(1)將排序目錄指定到一個磁盤比較大的位置;
(2)將排序緩存大小設置的適當小點;
(3)將臨時文件進行壓縮;
(4)排序目錄默認的就是系統配置的kettle_home的路徑,一般直接寫outs就行,並在kettle_home路徑下創建一個outs文件夾即可;
8、異常:java.net.SocketException: Broken pipe (Write failed):
(1)可能是kettle用的mysql-connection的jar包版本問題,換個與mysql數據庫最接近的jar包版本。
(2)可能是某一個轉換中用了事物,應該去掉事物的。
9、java.lang.ClassNotFoundException: org.safehaus.uuid.UUIDGenerator
原因1:kettle作業用生成UUID隨機數使用的是UUID,把UUID改成UUID4就可以解決問題了。
原因2:如果是數據寫入臨時文件時出現這個異常,那么就需要修改Kettle的源碼了,然后將編譯后的.class文件放在kettle-core的jar包中對應的文件夾下進行替換即可:
10、大量數據修改出現異常:lock wait timeout exceeded
解決方法:給數據配置以下信息:
net_read_timeout=28800
net_write_timeout=28800
innodb_lock_wait_timeout=500
十五、Kettle解析XML文件獲取數據:
1、核心思路:就是指定要循環讀取XML的路徑,並指定該路徑下每個字段對應的路徑,以便kettle能夠循環讀取XML中的數據,從而獲取所有記錄中不同字段的值。
2、具體步驟如下:
(1)選擇XML文件路徑(如果文件中各種節點路徑一模一樣,可以選擇多個文件,也可以通過正則表達式等選擇一定規則的多個文件):
(2)指定要循環讀取的XMP路徑,主要是從根節點開始到哪個節點需要循環讀取:
(3)指定每次讀取節點下的各個字段的名稱、路徑(書寫參照xPath意義)、屬性、數據類型等屬性:
(4)通過以上三步的操作,便可以完成簡單的XML文件讀取。
十六、使用kettle時必須要注意並且做到的幾個要點:
1、檢查連接數據庫的驅動版本,要做到jar包的版本和數據庫版本盡量接近;
2、創建數據庫連接的url中必須加上以下兩個參數:
?autoReconnect=true&failOverReadOnly=false
3、創建數據庫連接的參數中必須加上以下三個參數:(用於增加數據寫入速度)
useServerPrepStmts=false
rewriteBatchedStatements=true
useCompression=true
4、創建數據庫連接,如果使用的連接池,必須設置maxIdl值較大:
5、必須根據kettle軟件所在的硬件,修改spoon.bat(window)或spoon.sh(linux)的內存大小:
Window:
Linux:
6、能用控件處理的,就盡量不要寫js或java等處理了:比如uuid的生成等;
7、在作業中調用的任何一個轉換,都要將該轉換輸出到data-integration/logs文件夾下,參數設置如下:(在kettle轉換和作用中,默認的當前目錄就是KETTLE_HOME設定的data-integration目錄下)
8、在轉換中,如果用到了對記錄進行排序,將排序目錄設置在data-integration/outs文件夾,參數設置如下:(在kettle轉換和作用中,默認的當前目錄就是KETTLE_HOME設定的data-integration目錄下)
9、如果用到更新的時候,一定要選擇批量?跳過查詢兩個勾選:這樣可以提高更新的速度。
10、生成隨機數一定要用UUID4,否則管理平台調用會出現問題。
11、在每一個作業中,最好使用一個發郵件功能,在開始和成功中間任何一個步驟到發出一個異常流程,指向發郵件,這樣如果作業中任何一個環節出現異常,就會自動給指定的郵箱進行發送郵件(非常注意:發送郵件的發送郵箱一定要開通第三方授權碼,通過授權碼作為密碼來發送功能)
12、在每一個作業開始執行時,都要添加一個檢查數據庫連接控件,用來檢查該作業中所有用到的數據庫連接是否能夠正常連接,如果連接不上,則可以通過發送郵件進行提醒,如果不檢查的話,數據庫因為網絡通信問題連接不上,kettle作業中的異常是不會發送郵件的:
非常注意:如果檢測的是多個數據庫連接,那么只有所有的數據庫都能連接上,才算是正確,如果有任何一個數據庫連接不上,都會是異常。
13、如果用Kettle做大量數據,很多字段的更新的話,如果用簡單的更新控件,更新速度非常的慢,通過經驗發現,通過這樣處理,可以增加更新的效率,缺點就是操作人員寫作業時間較長:
(1)不是更新所有字段,而是先判斷該字段是否發生變化,如果發生變化了就只更新該字段+更新時間,兩個字段值;
(2)因此需要對獲取的記錄通過復制的方式,分發給不同字段判斷的過濾條件控件;
(3)在更新控件中,一定要勾選批量更新、跳過查詢,可以提高速度。
14、設置的變量作用范圍:核心一點,最好就是變量的作用范圍為當前作業,尤其對於費定時任務,有可能多個作業同時啟動的,一定要將變量的作用范圍設定在當前作業中,如果設置變量的操作是在一個轉換中,然后一個作業進行調用這個轉換,那么變量的作用范圍就是parent-job,一般不選擇整個JVM,具體情況,根據設定變量這個操作的位置不同,決定其作用范圍的設置,一句話,一個作業中的變量作用范圍,最好就是在該作業內有效。
十七、利用kettle實現動態遷移整個數據庫:
1、主題思路:
有主作業、子作業兩個作業組成這個流程,在主作業中,首先調用一個轉換用來獲取指定庫中所有的表名、表sql等內容復制到結果記錄,然后調用一個子作業,子作業中先調用一個轉換用來結果記錄中的信息,然后設置變量,變量有效范圍為parent_job,然后子作業再調用一個轉換,用來執行sql腳本創建表結構和獲取源數據表中的數據再輸出到對應的目標數據庫中表中即可,因為字段名稱是一致的,所以不需要指定字段映射;
2、實現過程截圖:
3、具體作業,詳情見自我總結常用功能/整庫遷移中的作業
自我感悟:如果想要動態的設置變量,就需要在主作業中嵌套一個子作業,子作業中調用一個轉換,轉換的功能就是通過從子作業的上一步中獲取結果信息,然后將信息設置成變量,變量的有效范圍parent-job;
十八、Kettle尋找資源庫的原理:
Kettle首先是通過KETTLE_HOME下尋找.kettle文件下的資源庫,如果沒有配置KETTLE_HOME那么kettle尋找資源庫是通過當前登錄用戶下的.kettle文件尋找資源庫;
十九、Kettle修改資源庫登錄用戶密碼:
Kettle資源庫創建好后,有默認的admin/admin、guest/guest兩個用戶,修改用戶登錄密碼操作如下圖所示:
二十、Kettle大量數據遷移,跳過異常數據繼續執行,輸出異常數據:
1、在表輸出后添加一個異常輸出到excel文件的控件,輸出字段自己選擇,這樣可以讓異常數據中的信息輸出到excel中;