1.背景
背景:在mysql数据库中进行数据迁移(表之间迁移,字段转换),发现表的数据量大的时候,kettle对表的读写操作的速度很慢,并且是达到一定数据量以后速度会特别慢,数据量小的时候读的速度是很快。
2.kettle执行测速
2.1 读写数据速度测试
5000条数据读写速度测试:8min24s 即 504s
20000条数据读写速度测试: 16min32s 即 992s
200000条数据读写速度测试,任务直接失败,跑不起来。
3.优化方向
3.1 修改数据库连接参数
打开表输入和表输出的数据库连接添加以下参数:表输入或表输出=>编辑数据库连接=>选项
命名参数 | 值 | 参数说明 |
---|---|---|
useCompression | true | 在传输时开启数据压缩 ,提高传输效率 |
rewriteBatchedStatements | true | 让数据库重排Insert语句,合并多条插入语句成为一条,提交插入效率 |
useServerPrepStmts | false | 让数据库重排Insert语句,合并多条插入语句成为一条,提交插入效率 |
5000条数据的读写结果:3.1s
20000条数据读写速度测试: 11.6s
200000条数据读写速度测试: 2min18s 即138s
经过数据库参数的修改,读写效率明显提升86%以上。
3.2 kettle修改spoon.bat的运行内存大小(修改数据参数的基础上)
在kettle安装目录下编辑Spoon.bat文件,找到以下参数:
# 默认值
if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms1024m" "-Xmx2048m" "-XX:MaxPermSize=256m"
# 修改值(根据自己电脑配置修改)
"%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS= "-Xmx4096m" "-XX:MaxPermSize=4096m"
# 参数详解
# "-Xms4096m":配置java虚拟机堆区内存初始内存分配的大小 未配置
# "-Xmx4096m":配置java虚拟机堆区内存可被分配的最大上限
# "-XX:MaxPermSize=4096m":配置java对非堆区分配的内存的最大上限
注意:
开发过程中,通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。在配置之前一定要慎重的考虑一下自身软件所需要的非堆区内存大小,因为此处内存是不会被java垃圾回收机制进行处理的地方。并且更加要注意的是最大堆内存与最大非堆内存的和绝对不能够超出操作系统的可用内存。
提交记录数量更改为10000,即每次提交10000条记录
5000条数据的读写结果:3.2s
20000条数据读写速度测试: 10.6s
200000条数据读写速度测试: 2min1s 即121s
对比下的结果,在资源充足的情况下,数据库的连接参数对于读取速度影响较大。
3.优化的效果(读取840万数据的耗时)
8488225条数据读写速度测试: 1h 55min 10s 即6910s
4.总结
使用kettle时必须要注意点:
1、检查连接数据库的驱动版本,要做到jar包的版本和数据库版本尽量接近;
2、创建数据库连接的url中必须加上以下两个参数:
?autoReconnect=true&failOverReadOnly=false
3、创建数据库连接的参数中必须加上以下三个参数:(用于增加数据写入速度)
useServerPrepStmts=false
rewriteBatchedStatements=true
useCompression=true
4、创建数据库连接,如果使用的连接池,必须设置maxIdl值较大:
5、必须根据kettle软件所在的硬件,修改spoon.bat(window)或spoon.sh(linux)的内存大小: