0

我是 PDI 的新手,我使用 PDI 7,我有 6 行的 excel 输入,并希望将其插入 postgresDB。我的转换是:EXCEL INPUT --> Postgres Bulk Loader(仅 2 步)。

条件 1:当我运行转换时,Postgres 批量加载不会停止,也不会将任何内容插入我的 postgresDB。

条件 2:因此,我在 Postgres Bulk Loader 之后添加了“插入/更新”步骤,并将所有数据插入到 postgresDB 中,这意味着成功,但批量加载器仍在运行。

我的蜕变

从我能得到的所有来源,他们只需要输入和 Bulk Loader 步骤,并且在完成转换后,bulk loader 是“完成”(我的“运行”)。所以,我想问一下如何正确地为 Postgres 做到这一点?我跳过了一些重要的事情吗?谢谢。

4

4 回答 4

1

PostgreSQL 批量加载器过去只是实验性的。有一段时间没试过了。你确定你需要它吗?如果您从 Excel 加载,则不太可能有足够的行来保证使用批量加载程序。

尝试常规Table Output步骤。如果您只是插入,则也不需要该Insert/Update步骤。

于 2017-01-24T17:18:48.943 回答
0

要仅插入 7 行,您不需要批量加载程序。Bulk loader 旨在加载大量数据。它使用本机 psql 客户端。PSQL 客户端传输数据的速度要快得多,因为它使用二进制协议的所有功能,不受 jdbc 规范的任何限制。JDBC 用于表输出等其他步骤。大多数时间表输出就足够了。

Postgres Bulk Loader 步骤只是从传入的步骤中以 csv 格式构建内存数据并将它们传递给 psql 客户端。

于 2017-01-25T14:13:24.430 回答
0

我确实做了一些实验。

环境:

  • 数据库:Postgresv9.5x64
  • PDI 水壶 v5.2.0
  • PDI KETTLE 默认 jvm 设置 512mb
  • 数据源:超过 2_215_000 行的 DBF 文件
  • PDI 和 Kettle 在同一个本地主机上
  • 每次运行时表被截断
  • PDI Kettle 在每次运行时重新启动(以避免由于大量行而导致 gc 运行的 CPU 负载过重)

结果在下方,可帮助您做出决定

  1. Bulk loader:平均每秒超过 150_000 行,大约 13-15 秒

  2. 表输出(sql 插入):平均每秒 11_500 行。总计约 3 分 18 秒

  3. 表输出(批量插入,批量大小 10_000):平均每秒 28_000 行。总计约 1 分 30 秒

  4. 表输出(在 5 个线程中批量插入批量大小 3_000):每个线程平均每秒 7_600 行。意味着每秒大约 37_000 行。总时间约为 59 秒。

Buld loader 的优点是不会填满 jmv 的内存,所有数据都会立即流式传输到 psql 进程中。

表输出用数据填充 jvm 内存。实际上在大约 1_600_000 行内存已满并启动 gc 之后。CPU 时间加载到 100% 并且速度显着减慢。这就是为什么值得使用批量大小,以找到能够提供最佳性能(越大越好)但在某种程度上会导致 GC 开销的值。

最后一次实验。提供给 jvm 的内存足以容纳数据。这可以在变量 PENTAHO_DI_JAVA_OPTIONS 中进行调整。我将 jvm 堆大小的值设置为 1024mb 并增加了批处理大小的值。

  1. 表输出(在 5 个线程中批量插入批量大小 10_000):每个线程平均每秒 12_500 行。意味着每秒总共大约 60_000 行。总时间约为 35 秒。

现在更容易做出决定。但是您必须注意一个事实,即kettle pdi 和数据库位于同一主机上。如果主机不同,网络带宽可以在性能方面发挥一些作用。

在此处输入图像描述

于 2017-01-26T08:57:00.260 回答
0

缓慢的插入/更新步骤 为什么必须避免使用插入/更新(在处理大量数据或时间有限的情况下)?

让我们看看文档

插入/更新步骤首先使用一个或多个查找键在表中查找一行。如果找不到该行,则插入该行。如果可以找到并且要更新的字段相同,则什么也不做。如果它们不完全相同,则更新表中的行。

在状态之前,对于流步骤中的每一行,将执行 2 个查询。它是先查找,然后更新或插入。PDI Kettle 的来源声明 PreparedStatement 用于所有查询:插入、更新和查找。

因此,如果这一步是瓶颈,那么请尝试找出究竟是什么慢了。

  • 查找速度慢吗?(对样本数据在数据库上手动运行查找查询。检查速度是否慢?查找字段是否在用于查找数据库中对应行的那些列上有索引)
  • 更新慢吗?(对样本数据在数据库上手动运行查找查询。检查速度很慢?更新 where 子句是否在查找字段上使用索引)

无论如何,这一步很慢,因为它需要大量的网络通信和水壶中的数据处理。

使其更快的唯一方法是将数据库中的所有数据加载到“临时”表中并调用将更新数据的函数。或者只是在工作中使用简单的 sql 步骤来做同样的事情。

于 2017-02-15T10:08:15.757 回答