使用kettle在大数据情况下出现内存溢出的情况处理方案

数据量太大,首先想到的办法就是分页执行,这一点oracle跟mysql不一样,mysql有limit语法,而oracle没有这个语法,oracle需要rownum并且需要别名嵌套才能实现limit的功能。

如果使用分页循环,设置环境变量,然后在转换中获取环境变量,这种情况下整个流程是在一个job里面,kettle是运行在jvm中的,通过观察jvm的垃圾回收情况,发现,kettle中并未有堆回收(但是觉着这是kettle的一个bug呢)。


因此,我们想到一条思路,如果让kettle能够自动进行垃圾回收,这个问题比较发散,思考过脚本定期干预jvm垃圾回收机制,还有一种也是通过我们大量的尝试工作,比如调整kettle的运行参数(无非就是配置文件的内存,这个有作用,但是还是无法从根本上解决问题,如果数据量无限扩大,内存总有极限值)
,调整队列大小,调整批处理个数等多种策略。

最终确定了将分页处理逻辑封装在一个job中,这样kettle的垃圾回收正好可以在每一个job中实现切换,自然实现了垃圾回收。这是一种思路,这块我总结:kettle的堆回收是在job切换的过程中进行了[非常重要]。


接下来,我们尝试如何让job内的变量获取到之后改变job外的环境变量,发现没有走通。之后我们进行了在一个job中的环境变量设置,js代码的获取及改变解决了这个问题。


最后打开jvm监控工具,发现了一条完美的直线,这样做,解决了kettle的垃圾回收,并且性能非常的稳定。

 

此处网上的答案非常少,分享出来,以后大家遇到这样的问题也好解决。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值