Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 并行运行大数据的Pentaho表输入步骤_Mysql_Pentaho_Transformation_Kettle_Pentaho Spoon - Fatal编程技术网

Mysql 并行运行大数据的Pentaho表输入步骤

Mysql 并行运行大数据的Pentaho表输入步骤,mysql,pentaho,transformation,kettle,pentaho-spoon,Mysql,Pentaho,Transformation,Kettle,Pentaho Spoon,我对Pentaho比较陌生。我正在做一项35个并行转换的工作,每个转换都从MySQL数据库中读取大约100万数据,并存储到另一个数据库(MSSQL)中 但它在几分钟内失败,并显示:java.lang.OutOfMemoryError:GC开销限制超过了 我想知道如何简化这个过程,是否有任何方法可以以批处理方式读取数据,或者在转换中使用循环,以便在每次转换中以块(比如5000)的形式读取数据 另外,在并行运行这么多转换时,从表中读取大型数据的最佳方法是什么。以及“行集中行的Nr”值如何影响海量数据

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

但它在几分钟内失败,并显示:
java.lang.OutOfMemoryError:GC开销限制超过了

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

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

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





请让我知道,如果我可以分享更多的细节更好的解释


提前谢谢

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

对于直接的表拷贝或简单的行级转换,我从未遇到过内存问题。一个很大的区别是,我使用了一个转换,其中有20个表输入,每个表输入连接到它们自己的表输出。这样的话,开销可能会更低

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

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

还有一些特殊情况下的步骤,需要在开始输出行之前保留很多行甚至所有行。分组方式、排序、阻塞步骤都是示例。其中一些具有将中间数据写入磁盘的能力,而另一些则没有。避免这些批量操作,或者特别注意它们的数据流以优化它

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

优化此类操作有很多方面,因此我无法一一列出,但这些方面在过去为我解决了一些问题:

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

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

对于直接的表拷贝或简单的行级转换,我从未遇到过内存问题。一个很大的区别是,我使用了一个转换,其中有20个表输入,每个表输入连接到它们自己的表输出。这样的话,开销可能会更低

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

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

还有一些特殊情况下的步骤,需要在开始输出行之前保留很多行甚至所有行。分组方式、排序、阻塞步骤都是示例。其中一些具有将中间数据写入磁盘的能力,而另一些则没有。避免这些批量操作,或者特别注意它们的数据流以优化它

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

优化此类操作有很多方面,因此我无法一一列出,但这些方面在过去为我解决了一些问题:

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

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