Kettle是一个应用广泛的ETL工具,支持大数据量肯定是没有问题的,但是最近在做一个项目时,压力测试阶段总是出现莫名奇妙的问题,经过不懈努力总算是解决了,下面把遇到的问题介绍如下,供兄弟姐妹们参考:
1. 运行过程中收到 java.lang.OutOfMemoryError: Java heap space 错误
这个错误主要是Java的内存不足(heap space:堆空间)造成的,这个问题有时候无法避免,因为数据量就是那么大。解决这个问题有两个方向:
a. 给Java分配更多的内存,方法是:打开kitchen.sh/kitchen.bat,找到”OPT=”$PENTAHO_DI_JAVA_OPTIONS -cp …… ” 改为”OPT=”-Xmx4096m -cp …… ”
看到了吗,缺省512m,我一狠心给它改成了4096m,就是4G啦。我手头的这个服务器有64G的物理内存,改成4G不过分吧?所以用这个方法就已经无敌了。
b. 把“源数据库->目的数据库”的转换(Transformation)拆分为“源数据库–>文本文件”和“文本文件–>目的数据库”两个转换。(尚未试验,但据下面的这个帖子所述应该可以解决问题:http://forums.pentaho.com/archive/index.php/t-68806.html)
2. 没有错误,运行到读或者写数据时一直在等待,小数据量没问题,大数据量才会出现问题
这个问题确实很费解,经过n多试验发现了问题的根源在Transformation的设置,如下图所示,要把Nr of rows in rowset设置为足够大,最好是你能用到的数量级后面加个0吧。我试验的是15W左右的数据,但是当时的设置时10W,我发现目的数据库的数据量停留在了100001不再增加了,于是就联想到了好像在这个界面看到了一个100000的东东,无论多么费劲吧,问题解决了总是值得欣慰的。猜想一下这个设置,可能是Kettle的设计者希望能预先知道最大会有多少数据,以便做相应的准备工作吧。另外,顺便说一下这个窗口里面的Feedback size,指每多少条记录会有一个信息提示出来,以便你知道进度。