Kettle性能优化是一个系统工程,不仅涉及工具本身的优化,更涉及ETL工具之外的诸多因素,比如,ETL要读取数据库,那么目标DMBS的性能,SQL语句,网络等相关因素都影响到执行效率。根据Kettle对数据ETL的过程性能调优,主要取决于三个因素:上游渠道,工具的大小与数量,下游渠道。

一 Kettle调优

调整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

调整提交(Commit)记录数大小进行优化(尽量提高批处理的commit size)

如修改“表输出”组件中的“提交记录数量”参数进行优化,Kettle默认Commit数量为:1000,可以根据数据量大小来设置Commitsize:1000~50000。

clipboard.png

调整记录集合里的记录数(RowSet)

RowSet是两个步骤之间的缓存.

性能调优的关键是如何找到性能瓶颈:一个重要的方法就是观察RowSet.如下图所示,当左边的in大于右边的out的位置时,很可能就是性能瓶颈的位置.(也可以通过单个执行最长的步骤来确定性能瓶颈.)

clipboard.png

通过点击转换空白处,可以调整rowset的大小.

clipboard.png

调整之后,执行效果如下:

clipboard.png

调整转换动作的并发处理数(改变开始复制的数量)

注意:此种方式要用在适合并发操作的场景,比如查询类,要注意死锁问题.

当调整rowset大小之后,性能效果仍不明显的话,可以尝试调整转换动作的并发处理数,比如以下转换操作在"数据库查询"处出现性能瓶颈.

clipboard.png

调整并发处理数:(一般设置成2-8个)

clipboard.png

执行情况如下图所示,速度明显提高了很多.

clipboard.png

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

kettle 内存设置_Kettle性能调优汇总相关推荐

  1. JVM内存模型和性能调优:系列文章 - 导读

    0.JVM课程总体介绍 学习 Java 虚拟机能深入地理解 Java 这门语言,想要深入学习java的各种细节,很多时候你要深入到字节码层次去分析,你才能得到准确的结论,通过学习JVM你了解JVM历史 ...

  2. Kettle性能调优汇总

    性能调优在整个工程中是非常重要的,也是非常有必要的.但有的时候我们往往都不知道如何对性能进行调优.其实性能调优主要分两个方面:一方面是硬件调优,一方面是软件调优.本章主要是介绍Kettle的性能优化及 ...

  3. java 内存调优_JVM内存模型以及性能调优

    JVM 内存模型 JVM.png 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成. ...

  4. JVM内存模型和性能调优:栈(线程)- 第11篇

    前言 栈是线程运行的单位,那接下我们不会讲太多概念性的东西,主要是通过Math.java这个类和大家分析学习. 一.线程栈分析 我们看下Math.java类: public class Math {p ...

  5. JVM内存模型和性能调优:垃圾收集算法:每秒几十万并发的系统优化JVM - 第34篇

    一.每秒几十万并发的系统优化JVM Kafka类似的支撑高并发消息系统大家肯定不陌生,对于Kafka来说,每秒处理几万甚至几十万消息时很正常的. 一般来说部署Kafka需要用大内存机器( 比如64G ...

  6. JVM内存模型和性能调优:阿里巴巴Arthas调优工具:什么是Arthas- 第43篇

    Arthas 是Alibaba开源的Java诊断工具. Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式 一.Arthas能为你做什么? 当你遇到以下类似问题而 ...

  7. JVM内存模型和性能调优:JVM调优工具详解及调优实战:jstat调优小实战- 第40篇

    一.准备工作 准备一个工程jvm-full-gc,核心代码: @RestController public class IndexController {@RequestMapping("/ ...

  8. JVM内存模型和性能调优:为什么要学习JVM

    0.JVM课程总体介绍 一图就可以搞明白:

  9. JVM内存模型和性能调优:JVM内存分配与回收:Minor GC后存活的对象Survivor区放不下- 第26篇

    Minor GC后存活的对象Survivor区放不下,这种情况会把存活的对象部分挪到老年代,部分可能还会放在Survivor区. (1)当我们的代码中有allocation1和allocation2 ...

最新文章

  1. 深入研究Java类加载机制
  2. d盘莫名其妙被占空间 win10_Win10不好用?你不可不知的Win10技巧
  3. mysql 不匹配的_mysql – 如何从两个表中获取不匹配的记录
  4. 分布式代码管理系统GIT
  5. 1+X web中级 Laravel学习笔记——Eloquent ORM查询、更新、删除、新增
  6. 头插法和尾插法创建链表(有无头结点)
  7. java程序 启动慢_spring boot 程序启动缓慢的问题
  8. ASP.NET MVC +EasyUI 权限设计(三)基础模块
  9. mysql mvc javascript_MVC中用Jquery、JS和Ajax 实现分页 存储过程是用mysql写的。
  10. 新增一个主键自增长_第17期:索引设计(主键设计)
  11. ***检测(IDS)存在的问题及发展趋势
  12. 安装Selenium+Firefox+Firepath+Firebug
  13. 下载Instagram的图片
  14. HUSTOJ搭建2021
  15. 公司为什么需要自己的SAP内部顾问
  16. yaahp层次分析法步骤_层次模型构造
  17. openAL在C++下的易用封装,调用直接播放3D音频,模拟3D音效
  18. 远程桌面连接遇到的问题及解决方法
  19. DSOX2022A示波器的使用
  20. 2022-2028全球及中国智能手机摄像头模组行业研究及十四五规划分析报告

热门文章

  1. 正则表达式---------常用字符及其功能
  2. Python中的抽象类和抽象方法
  3. C#常用类库----CSV文件操作类
  4. “~/” 代表应用程序根目录的一点误区
  5. asp.net学习之SqlDataSource 1 select的四种参数赋予形式的解释
  6. OpenFeign, Zuul, Gateway相互不兼容的问题总结
  7. Windows/Linux如何查看动态库的依赖关系?
  8. 【差分隐私的Advanced composition到底是什么?】差分隐私系统学习记录(四)
  9. Android图片上传和下载,android 上传/下载 图片
  10. 数据可视化系列(五):样式色彩秀芳华