Kettle性能调优汇总
jvm调优参数性能调优在整个⼯程中是⾮常重要的,也是⾮常有必要的。但有的时候我们往往都不知道如何对性能进⾏调优。其实性能调优主要分两个⽅⾯:⼀⽅⾯是硬件调优,⼀⽅⾯是软件调优。本章主要是介绍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、分离表和索引。