首页 > 解决方案 > pentaho 慢行进程

问题描述

我有一个输入表,其中包含 170.000 条记录,可以在我的步骤中进行转换。每条记录都有一个持续时间,特别是几天,JS步骤检查这个持续时间,例如如果记录有ini_date(2011/01/01) - end_date(2020/01/01),JS将为该记录创建aprox 3000行(输出带来170.000条不同范围的记录......其中一些有9年的持续时间)

  1. 改造需要将近 5:30 小时才能完成。
  2. 在 JS STEP 上写超过 100.000.000 行
  3. 然后将它们分组

起初我只使用 js 步骤来使用连接步骤、选择值步骤、排序行步骤和 stufs 来完成此任务。然后我将一些“数据转换”拆分为“计算器步骤”,认为这会缩短处理时间,但我得到了相同的处理时间

我只想将处理时间从 5 小时缩短到至少 1 或 2 小时,但转换中创建的行数太大而无法实现。请记住,如果一条记录有 9 年的周期,大约会生成 3000 行,这只是一个。知道输入步骤会带来 170.000 条记录和不同的范围。

在此处输入图像描述

标签: javascriptpentaho

解决方案


如果您的 JS 步骤生成大约 100M 行,那么您的 ETL 将以每秒大约 5.5k 行的速度运行。它不快,但也没有那么慢。

我不完全了解您要实现的目标,很高兴看到 group by 正在做什么。

但是,无论如何,这里有一些想法可以让它更快:

  1. 在 JS 中创建新行特别慢,应该避免。您最好使用计算器步骤计算日期之间的天数,然后使用克隆行创建所需的行副本。您可以添加一个“克隆号”字段,它为每个重复的行提供一个计数器,以便后续的计算器步骤可以执行诸如将计数器添加到开始日期之类的操作。

  2. 如果要对行进行分组,则输入必须按组键排序,否则会得到意想不到的结果。

  3. 运行转换时,瓶颈在哪里?您可以在步骤指标选项卡中看到输入/输出列,该列测量每个步骤的输入和输出缓冲区的填充程度。通常通过查找具有完整输入缓冲区(默认为 10k 行)和空输出缓冲区的步骤来识别瓶颈。因此,如果 JS 步骤最慢,您将看到它的输入缓冲区为 10k,并且上游的所有输入和输出缓冲区也显示 10k 行,而下游的所有输入和输出缓冲区将是空的或几乎是空的。

  4. 最后,如果您正在写入数据库,则预计输出永远不会像在 PDI 内部处理行一样快。每秒 5k 行通常是一个很好的性能,并且很难显着提高。但是,您可以停止使用表输出步骤,而使用批量加载程序。大多数数据库批量加载程序需要将数据写入文件,但 MySQL 可以在 Mac 或 Linux 中与 FIFO 一起使用(在 Windows 中不起作用)


推荐阅读