Pentaho数据集成(PDI)如何使用postgresql批量加载器?我的转型永远在逃

时间:2017-01-24 09:11:54

标签: pentaho kettle pentaho-spoon pdi pentaho-data-integration

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

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

条件2:所以,我添加"插入/更新"继Postgres Bulk Loader之后,将所有数据插入postgresDB,这意味着成功,但批量加载器仍在运行。

My transformation

从我可以得到的所有来源,他们只需要输入和Bulk Loader步骤,并且在完成转换之后,批量加载器已经完成了#34; (我的"跑步")。所以,我想问一下Postgres如何正确地使用它?我是否跳过重要的事情?感谢。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我做了一些实验。

环境:

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

结果在下面以帮助您做出决定

  1. 批量加载程序:13-15秒左右平均每秒超过150_000行

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

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

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

  5. 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秒。
    2. 现在更容易做出决定。但你必须注意到事实,即水壶pdi和数据库位于同一主机上。如果主机不同,网络带宽可以在性能方面发挥一定作用。

      enter image description here

答案 3 :(得分:0)

慢插入/更新步骤 为什么你必须避免使用插入/更新(如果处理了大量数据或者你受到时间的限制)?

让我们看一下文档

  

“插入/更新”步骤首先使用一个或中查找表中的一行   更多查找键。如果找不到该行,则会插入该行。如果它   可以找到并且要更新的字段是相同的,没有做任何事情。   如果它们不完全相同,则表中的行会更新。

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

因此,如果这一步是瓶颈,那么试着弄清楚究竟是什么慢。

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

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

使速度更快的唯一方法是将数据库中的所有数据加载到“temp”表中,并将调用函数加载数据。或者只是在job中使用简单的sql步骤来做同样的事情。