我对Pentaho比较新。我正在与一个并行运行的35个转换工作,每个转换从MySQL数据库读取大约1M亿个数据并存储到另一个数据库(MSSQL)。
但它在几分钟内失败并显示:java.lang.OutOfMemoryError: GC overhead limit exceeded
。
我想知道如何简化此过程,如果有任何方法以批处理方式读取数据,或者我可以在转换中使用循环,以便在块中读取数据(比如5000)在每次转型中。
此外,当并行运行如此多的转换时,从表中读取大数据的最佳方法是什么。并且“Rowset中的行数”值如何影响大数据的性能。
我在论坛上尝试了一些东西,但没有得到任何明显的改进。
http://forums.pentaho.com/showthread.php?160467-how-to-improve-performance-of-Table-input-Table-output-step
http://forums.pentaho.com/showthread.php?85626-Kettle-4-2-0-Stable-Table-Input-does-full-table-read
http://forums.pentaho.com/showthread.php?59364-Optimum-Nr-of-Rows-in-Rowset
如果我可以分享更多细节以便更好地解释,请告诉我。
提前致谢!
答案 0 :(得分:2)
我在过去的类似场景中使用过PDI,但使用的数据库不同。
使用直表副本或简单的行级转换,我从未遇到内存问题。一个很大的区别是我使用了一个包含20个表输入的转换,每个输入都连接到它们自己的表输出。也许开销就低了。
据我了解,转换中的每个跃点代表一个行缓冲区,默认情况下最多可容纳10k行。这些在度量中可见,作为步骤的输入/输出缓冲区并保存在内存中。这意味着行越大,步骤越多,所需的内存就越多。
对于最基本的情况(表输入 - >表输出),您将有一个10k行缓冲区。如果行平均为100个字节,则需要超过1 MB。 如果你有11个步骤(10个缓冲区)和32kb的行大小,如果所有缓冲区都填满,你可能需要超过3.2 GB。
还有一些特殊的案例步骤需要在开始输出行之前保留很多行甚至所有行。分组依据,排序,阻止步骤是示例。他们中的一些人有能力将中间数据写入磁盘,其他人则没有。在批量操作中避免使用这些操作或特别注意其数据流以对其进行优化。
如果您的目标数据库无法跟上(一种常见的情况,因为写入更加昂贵),所有缓冲区都可以快速填满。如此多的转换一次写入数据库也可能会影响性能。
优化此类操作有很多方面,所以我无法将它们全部列出,但这些已经解决了我的问题: