前言,虚拟机搭建环境,发现kettle非常占用内存,排查服务器资源情况,发现是polkitd进程
暂时也没有好的解决方案,目前就是读了一个大表的过滤,之前都是很小的表,没有发现内存占用这么快。
、
只能采用分页读取,但是kettle里面没有配置分页读取的,只能通过job来实现,下面搜索资料,进入理论实践。
kettle分页循环.kjb
主job结构:
【1】转换:获取页数.ktr ——用来获取页数表结构
【2】作业:获取参数循环抽数.kjb —— 获取分页数,设置参数,获取参数进行循环抽数。
1.获取源表页数
#取总页数
SELECT ceil(count(1)/5000) as pages FROM table1
mysql获取行号:SELECT ROW_NUMBER()OVER() from table1;
分页页数要用整数
2.字段选择
3.表输入
这里会借助rownum 获取一个类似下面这样的表结构
4.字段选择
和步骤2的字段选择设置差不多
5.复制结果到记录
直接拖拽作业控件中的复制记录到结果组件过来连线即可
再看第二个作业
这个作业由2个转换组成,一个是设置变量,一个是获取变量加抽数
转换:设置变量
从结果获取记录
设置变量
转换:获取变量加抽数
这里就是简单的表输出到表输出,但具体设置有一点区别。
表输入
这是最终版的设置,也就是说在设置完表输出之后,要回来将SQL设置成以下内容:
SELECT B.rn,B.* FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM table1) A
WHERE ROWNUM <= (${VAR_P_PAGE}*5000)
) B
WHERE RN >= ((${VAR_P_PAGE}-1)*5000+1)
设置全部完成,可以开始跑作业了
Mysql的limit计算语句错误问题
在MySQL里面使用limit (2-1)*10,10是不支持的
中文汉化,时区问题
#/usr/local/tomcat/bin/setenv.sh
CATALINA_OPTS="-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"
JAVA_OPTS="-Duser.language=zh -Duser.region=CN -Dfile.encoding=UTF-8 -Duser.timezone=GMT+08"
最后还要记住,因为要遍历上一次的执行结果,主流程第二个作业要勾选执行每一个输入行
kettle的文件
压缩备份文件
遇到的问题
1,无法执行动态分页
可通过字段计算出来,也可能是自己还不会用
执行计算的变量值类型有误,如limit 0.0,10.0
参数格式一定要用#