如何从pentaho kettle步骤中设置的结果中获取所有结果输入表?

问题描述:

我有两个简单的转换步骤。 1步(输入表)对DB进行查询,2步(Java类)处理结果。 2步需要很多时间(这在我的情况下是正常的),但1小时后,我收到关闭结果集的错误如何从pentaho kettle步骤中设置的结果中获取所有结果输入表?

服务器已关闭连接。如果结果集包含大量数据,则服务器期望客户端相对较快地读取结果集。在这种情况下,请考虑增加net_wait_timeout会话变量。 /处理你的结果集更快(检查流结果集文档以获取更多信息) 2017/10/02 13:12:06 - 获取数据单元.0 -

我认为应该有一些中间步骤(或一些其他选项)得到比较快的所有结果从1步。你能帮我解决吗?

+0

我有一个(不那么)愚蠢的问题:是否真的是由于Java类的一步?我的意思是,“输入表”通常因其他原因被锁定。你可以用Dumy步骤替换第2步,看看它是否仍然锁定。 – AlainD

+0

其他(不那么)愚蠢的问题:你的java类可能会锁定数据库吗?它是否使用任何'JDBC'? – AlainD

+0

是的,它使用 - (在某些情况下java类可以发送更新查询到数据库)。那么这可能导致连接(和相应的结果集)关闭1步? – palandlom

我猜你步骤2中锁定相同的表作为一个在步骤1

这就是PDI的,否则高效的架构的缺点之一。所有步骤同时启动,并且最快的产生结果使得手能够进入下一步。有了这个“做最快的第一个”的策略,当有大量的平均数或者平均数的加入时,你有时会打败sql优化器本身(按比例)。

在这方面的主要缺陷是读表,进行一些改造,并与truncate table检查改写在同一个表的结果。在这种情况下,在选择启动无限死锁的输入表之前,截断操作需要几毫秒。很长时间后,你决定杀死ETL,但那时数据已经丢失。

解决方案

  • 最佳实践是使用PDI步骤,而不是使用现成的Java类重写第二步。从长远来看,这是我强烈建议的方式,但您可能有一些理由不遵循它。

  • 如果您的表很小,您可以在输入和输出之间放置一个blocking step

  • 如果表格很大,则可以使用sort row步骤代替阻止步骤。您并不想排序,但PDI需要查看最后一行以确保排序完成,然后才能将结果提供给下一步。这种排序将会削减硬盘上临时块中的数据,并且可以对tmp数据的存储位置和方式进行一定的控制。

  • 您可以将表格复制到tmp表格(或文件)中,然后处理并删除它。用工作来做到这一点,因为在工作中,与变革不同,这个过程是顺序的。

+0

谢谢,详细解释!我希望我的理解正确 - 我从java-class中删除了执行UPDATE-query的代码,并添加了从第2步接收某个字段并进行UPDATE查询的3步(INSERT/UPDATE步骤)。 – palandlom

+0

恭喜。真诚。死锁从来不是一个简单的错误。 – AlainD