性能調優在整個工程中是非常重要的,也是非常有必要的。但有的時候我們往往都不知道如何對性能進行調優。其實性能調優主要分兩個方面:一方面是硬件調優,一方面是軟件調優。本章主要是介紹Kettle的性能優化及效率提升。
一、Kettle調優
1、 調整JVM大小進行性能優化,修改Kettle定時任務中的Kitchen或Pan或Spoon腳本。
修改腳本代碼片段
set OPT=-Xmx512m -cp %CLASSPATH% -Djava.library.path=libswt\win32\ -DKETTLE_HOME="%KETTLE_HOME%" -DKETTLE_REPOSITORY="%KETTLE_REPOSITORY%" -DKETTLE_USER="%KETTLE_USER%" -DKETTLE_PASSWORD="%KETTLE_PASSWORD%" -DKETTLE_PLUGIN_PACKAGES="%KETTLE_PLUGIN_PACKAGES%" -DKETTLE_LOG_SIZE_LIMIT="%KETTLE_LOG_SIZE_LIMIT%"
參數參考:
-Xmx1024m:設置JVM最大可用內存為1024M。
-Xms512m:設置JVM促使內存為512m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。
-Xmn2g:設置年輕代大小為2G。整個JVM內存大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
樣例:OPT=-Xmx1024m -Xms512m
2、 調整提交(Commit)記錄數大小進行優化
如修改RotKang_Test01中的“表輸出”組件中的“提交記錄數量”參數進行優化,Kettle默認Commit數量為:1000,可以根據數據量大小來設置Commitsize:1000~50000。
3、 調整記錄集合里的記錄數
4、盡量使用數據庫連接池;
5、盡量提高批處理的commit size;
6、盡量使用緩存,緩存盡量大一些(主要是文本文件和數據流);
7、Kettle是Java做的,盡量用大一點的內存參數啟動Kettle;
8、可以使用sql來做的一些操作盡量用sql;
Group , merge , stream lookup,split field這些操作都是比較慢的,想辦法避免他們.,能用sql就用sql;
9、插入大量數據的時候盡量把索引刪掉;
10、盡量避免使用update , delete操作,尤其是update,如果可以把update變成先delete, 后insert;
11、能使用truncate table的時候,就不要使用deleteall row這種類似sql合理的分區,如果刪除操作是基於某一個分區的,就不要使用delete row這種方式(不管是deletesql還是delete步驟),直接把分區drop掉,再重新創建;
12、盡量縮小輸入的數據集的大小(增量更新也是為了這個目的);
13、盡量使用數據庫原生的方式裝載文本文件(Oracle的sqlloader, mysql的bulk loader步驟);
14、盡量不要用kettle的calculate計算步驟,能用數據庫本身的sql就用sql ,不能用sql就盡量想辦法用procedure,實在不行才是calculate步驟;
15、要知道你的性能瓶頸在哪,可能有時候你使用了不恰當的方式,導致整個操作都變慢,觀察kettle log生成的方式來了解你的ETL操作最慢的地方;
16、遠程數據庫用文件+FTP的方式來傳數據,文件要壓縮。(只要不是局域網都可以認為是遠程連接)。
二、索引的正確使用
在ETL過程中的索引需要遵循以下使用原則:
1、當插入的數據為數據表中的記錄數量10%以上時,首先需要刪除該表的索引來提高數據的插入效率,當數據全部插入后再建立索引。
2、避免在索引列上使用函數或計算,在where子句中,如果索引列是函數的一部分,優化器將不使用索引而使用全表掃描。
3、避免在索引列上使用 NOT和 “!=”,索引只能告訴什么存在於表中,而不能告訴什么不存在於表中,當數據庫遇到NOT和 “!=”時,就會停止使用索引轉而執行全表掃描。
4、索引列上用 >=替代 >
高效:select * from temp where deptno>=4
低效:select * from temp where deptno>3
兩者的區別在於,前者DBMS將直接跳到第一個DEPT等於4的記錄而后者將首先定位到DEPTNO=3的記錄並且向前掃描到第一個DEPT大於3的記錄。
三、數據抽取的SQL優化
1、Where子句中的連接順序。
2、刪除全表是用TRUNCATE替代DELETE。
3、盡量多使用COMMIT。
4、用EXISTS替代IN。
5、用NOT EXISTS替代NOT IN。
6、優化GROUP BY。
7、有條件的使用UNION-ALL替換UNION。
8、分離表和索引。