【问题标题】:How to get all results from results set in pentaho kettle step Input table?如何从pentaho水壶步骤输入表中的结果集中获取所有结果?
【发布时间】:2017-10-10 07:21:32
【问题描述】:

我有一个简单的转换,包括 2 个步骤。 1 步(输入表)对 DB 进行查询,2 步(Java 类)处理结果。 2 步需要很长时间(在我的情况下这很正常),但 1 小时后我收到关闭结果集的错误

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

我认为应该有一些中间步骤(或其他选项)来相对快速地从 1 步骤获得所有结果。你能帮我解决这个问题吗?

【问题讨论】:

  • 我有一个(并非如此)愚蠢的问题:真的是由于 java 类步骤造成的吗?我的意思是,Input table 经常因为其他原因被锁定。你能用Dumy步骤替换第2步,看看它是否仍然锁定。
  • 另一个(并非如此)愚蠢的问题:您的 java 类可以锁定数据库吗?它是否使用任何JDBC
  • 是的,它使用 - (在某些情况下,java 类可以将 UPDATE 查询发送到 DB)。那么这会导致连接(和相应的结果集)关闭 1 步吗?

标签: database pentaho-spoon pentaho-data-integration


【解决方案1】:

我猜你的第 2 步是锁定与第 1 步相同的表。

这是 PDI 高效架构的缺点之一。所有步骤同时启动,以最快的速度产生结果,帮助您进行下一步。使用这种“先做最快”的策略,当存在大量求和或平均值连接时(按比例),您有时会击败 sql 优化器本身。

这方面的主要缺陷是读取一个表,进行一些转换并在同一个表上重写结果,并选中truncate table。在这种情况下,截断是在选择输入表之前几毫秒完成的,这会启动无限死锁。很长一段时间后,您决定终止 ETL,但当时数据已丢失。

解决方案

  • 最佳实践是使用 PDI 步骤重写 step2,而不是使用现成的 java 类。从长远来看,这是我强烈推荐的方式,但你可能有理由不遵循它。

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

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

  • 您可以将表复制到 tmp 表(或文件)中,然后处理并删除它。使用作业来执行此操作,因为在作业中,与转换不同,该过程是连续的。

【讨论】:

  • 感谢详细解释!我希望我理解正确 - 我从 java-class 中删除了执行 UPDATE 查询的代码,并添加了 3 步(INSERT/UPDATE 步骤),它从 2 步接收一些字段并进行 UPDATE 查询。
  • 恭喜。真挚地。死锁从来都不是简单的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多