Kettle性能調優彙總

Kettle性能優化是一個系統工程,不僅涉及工具本身的優化,更涉及ETL工具之外的諸多因素,比如,ETL要讀取數據庫,那麼目標DMBS的性能,SQL語句,網絡等相關因素都影響到執行效率。根據Kettle對數據ETL的過程性能調優,主要取決於三個因素:上游渠道,工具的大小與數量,下游渠道。

一 Kettle調優

  1. 調整JVM大小進行性能優化,修改Kettle定時任務中的Kitchen或Pan或Spoon腳本。

Kettle是Java做的,儘量用大一點的內存參數啓動Kettle;

##修改腳本代碼片段
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
  1. 調整提交(Commit)記錄數大小進行優化(儘量提高批處理的commit size)

如修改“表輸出”組件中的“提交記錄數量”參數進行優化,Kettle默認Commit數量爲:1000,可以根據數據量大小來設置Commitsize:1000~50000。

  1. 調整記錄集合裏的記錄數(RowSet)

RowSet是兩個步驟之間的緩存.

性能調優的關鍵是如何找到性能瓶頸:一個重要的方法就是觀察RowSet.如下圖所示,當左邊的in大於右邊的out的位置時,很可能就是性能瓶頸的位置.(也可以通過單個執行最長的步驟來確定性能瓶頸.)

通過點擊轉換空白處,可以調整rowset的大小.

調整之後,執行效果如下:

  1. 調整轉換動作的併發處理數(改變開始複製的數量)

注意:此種方式要用在適合併發操作的場景,比如查詢類,要注意死鎖問題.

當調整rowset大小之後,性能效果仍不明顯的話,可以嘗試調整轉換動作的併發處理數,比如以下轉換操作在"數據庫查詢"處出現性能瓶頸.

調整併發處理數:(一般設置成2-8個)

執行情況如下圖所示,速度明顯提高了很多.

5. 使用集羣,尤其是對於查詢類,運算類,排序等;

6. 更換其他實現方式,如js使用java類或插件;

7. 注意日誌級別(Rowlevel日誌的性能會嚴重下降,是Basic的1/10);

8. 注意死鎖問題:數據庫死鎖(讀寫同一張表)和轉換本身死鎖;

9. 儘量使用數據庫連接池;

使用數據庫連接池,可以在一定程度上提高速度.如何查看是否使用了數據庫連接池?(這個在詳細日誌中可以看到,使用了連接池).

10. 儘量使用緩存,緩存儘量大一些(主要是文本文件和數據流),比如排序;

11. 合適的使用數據庫索引,尤其對於數據庫查詢類.具體可以參考[索引的正確使用];

12. 可以使用sql來做的一些操作儘量用sql;

Group , merge , stream lookup,split field這些操作都是比較慢的,想辦法避免他們.,能用sql就用sql;

13. 插入大量數據的時候儘量把索引刪掉;

14. 儘量避免使用update , delete操作,尤其是update,如果可以把update變成先delete, 後insert;

15. 能使用truncate table的時候,就不要使用deleteall row這種類似sql合理的分區,如果刪除操作是基於某一個分區的,就不要使用delete row這種方式(不管是deletesql還是delete步驟),直接把分區drop掉,再重新創建;

16. 儘量縮小輸入的數據集的大小(增量更新也是爲了這個目的);

17. 儘量使用數據庫原生的方式裝載文本文件(Oracle的sqlloader, mysql的bulk loader步驟);

18. 儘量不要用kettle的calculate計算步驟,能用數據庫本身的sql就用sql ,不能用sql就儘量想辦法用procedure,實在不行纔是calculate步驟;

19. 遠程數據庫用文件+FTP的方式來傳數據,文件要壓縮。(只要不是局域網都可以認爲是遠程連接)。

20. 在確保結果輸出正確的情況下,能使用並行處理的就不要使用串行處理.

二 索引的正確使用

在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、分離表和索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章