1. 程式人生 > >Kettle性能調優匯總

Kettle性能調優匯總

!= proc 刪除 tle jsb calculate 部分 抽取 遠程數據庫

性能調優在整個工程中是非常重要的,也是非常有必要的。但有的時候我們往往都不知道如何對性能進行調優。其實性能調優主要分兩個方面:一方面是硬件調優,一方面是軟件調優。本章主要是介紹Kettle的性能優化及效率提升。

一、Kettle調優

1 調整JVM大小進行性能優化,修改Kettle定時任務中的KitchenPan或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,可以根據數據量大小來設置Commitsize1000~50000

技術分享圖片

3 調整記錄集合裏的記錄數

技術分享圖片

4、盡量使用數據庫連接池;

5、盡量提高批處理的commit size

6、盡量使用緩存,緩存盡量大一些(主要是文本文件和數據流);

7KettleJava做的,盡量用大一點的內存參數啟動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、盡量使用數據庫原生的方式裝載文本文件(Oraclesqlloader, mysqlbulk loader步驟)

14、盡量不要用kettlecalculate計算步驟,能用數據庫本身的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優化

1Where子句中的連接順序。

2、刪除全表是用TRUNCATE替代DELETE

3、盡量多使用COMMIT

4、用EXISTS替代IN

5、用NOT EXISTS替代NOT IN

6、優化GROUP BY

7、有條件的使用UNION-ALL替換UNION

8、分離表和索引。

Kettle性能調優匯總