【问题标题】:Pentaho table input step with large data running in parallel并行运行大数据的 Pentaho 表输入步骤
【发布时间】:2017-04-27 10:17:27
【问题描述】:

我对 Pentaho 比较陌生。我正在处理一个并行运行 35 个转换的作业,每个转换都从 MySQL 数据库读取大约 100 万个数据并存储到另一个数据库(MSSQL)中。

但它在几分钟内失败并显示:java.lang.OutOfMemoryError: GC overhead limit exceeded

我想知道如何简化此过程,以及是否有任何方法可以批量读取数据,或者我可以在转换中使用循环以便以块的形式读取数据(比如 5000)在每个转换中。

此外,当并行运行如此多的转换时,从表中读取大数据的最佳方法是什么。以及“行集中行数”值如何影响海量数据的性能。

我在论坛上尝试了一些东西,但没有得到任何明显的改进。

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

如果我可以分享更多细节以获得更好的解释,请告诉我。

提前致谢!

【问题讨论】:

  • 您是否尝试过单独运行每个转换?可能只有一个具有巨大的数据字段或某个步骤会消耗所有内存。如果所有这些都完成且没有错误单独运行,您可以开始添加更多一起并查看它何时开始失败。

标签: mysql pentaho transformation kettle pentaho-spoon


【解决方案1】:

我过去曾在类似的场景中使用过 PDI,但使用不同的数据库。

使用直接表副本或简单的行级转换,我从来没有遇到过内存问题。一个很大的不同是我使用了一个带有 20 个表输入的单一转换,每个输入都连接到它们自己的表输出。也许这样开销会更低。

据我了解,转换中的每一跳都代表一个行缓冲区,默认情况下最多可容纳 10k 行。这些在度量中作为步骤的输入/输出缓冲区可见,并保存在内存中。这意味着行越大,步骤越多,需要的内存就越多。

对于最基本的情况(表输入 -> 表输出),您将拥有一个 10k 行缓冲区。如果行平均为 100 字节,您将需要超过... 1 MB。 如果您有 11 个步骤(10 个缓冲区)和 32kb 的行大小,如果所有缓冲区都填满,您可能需要超过 3.2 GB。

还有一些特殊情况的步骤需要保留很多行甚至所有行才能开始输出行。 Group By、Sort、Blocking Step 就是例子。其中一些能够将中间数据写入磁盘,而另一些则没有。在批量操作中避免这些,或特别注意它们的数据流以优化它。

如果您的目标数据库跟不上(这是一种常见情况,因为写入成本更高),所有缓冲区都会很快填满。一次将这么多转换写入数据库也可能会影响性能。

优化这种操作有很多方面,所以我不能一一列举,但这些已经为我解决了过去的问题:

  • 增加每次提交的行数,这可能会提高目标数据库的吞吐量。
  • 增加 Java 堆(启动文件中的 -Xmx 选项)。
  • 在源数据库中进行排序。
  • 如果擅长的话,在数据库中进行分组(MySQL 给了我不好的结果)。
  • 如果在表输出之前有许多步骤并且缓冲区已满,请拆分转换。将文本文件输出代替表格输出,因为这些通常快如闪电。在第二个转换中,您只放置文本文件输入和表格输出。

【讨论】:

  • 是的,只是增加 Xmx。默认值非常低。
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多