Pentaho数据集成(PDI)如何使用postgresql批量加载程序?我的转变永远在运行

Pentaho数据集成(PDI)如何使用postgresql批量加载程序?我的转变永远在运行,pentaho,kettle,pentaho-spoon,pdi,pentaho-data-integration,Pentaho,Kettle,Pentaho Spoon,Pdi,Pentaho Data Integration,我是PDI新手,我使用PDI7,我有6行的excel输入,我想把它插入postgresDB。我的转换是:EXCEL输入-->Postgres批量加载程序(仅2步) 条件1:当我运行转换时,Postgres批量加载不会停止,也不会向我的postgresDB插入任何内容 条件2:因此,我在Postgres批量加载程序之后添加了“插入/更新”步骤,所有数据都插入到postgresDB,这意味着成功,但批量加载程序仍在运行 从我能得到的所有源代码中,它们只需要输入和批量加载步骤,在完成转换之后,批量加

我是PDI新手,我使用PDI7,我有6行的excel输入,我想把它插入postgresDB。我的转换是:EXCEL输入-->Postgres批量加载程序(仅2步)

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

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


从我能得到的所有源代码中,它们只需要输入和批量加载步骤,在完成转换之后,批量加载程序“完成”(我的“运行”)。那么,我想问一下,如何为博士后正确地理解这一点?我跳过了重要的事情吗?谢谢。

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


尝试常规的
表格输出步骤。如果只插入,也不需要执行插入/更新步骤。

只插入7行,不需要批量加载程序。 批量加载器设计用于加载大量数据。它使用本机psql客户端。PSQL客户机传输数据的速度更快,因为它使用了二进制协议的所有特性,而不受jdbc规范的任何限制。JDBC用于其他步骤,如表输出。大部分的时刻表输出是足够的


Postgres批量加载程序步骤只是从传入的步骤中以csv格式构建内存数据,并将它们传递给psql客户端。

我做了一些实验

环境:

  • DB:Postgresv9.5x64
  • PDI釜v5.2.0
  • PDI KETTLE defautl jvm设置512mb
  • 数据源:超过2_215_000行的DBF文件
  • 同一本地主机上的PDI和Ketter
  • 表在每次运行时被截断
  • 每次运行时都重新启动PDI釜(以避免由于大量行而导致gc运行的CPU负载过重)
下面的结果将帮助您做出决策

  • 散装装载机:平均每秒超过15万行,约13-15秒

  • 表输出(sql插入):平均每秒11_500行。总时间约为3分钟18秒

  • 表输出(批量插入,批量大小10_000):平均每秒28_000行。总时间约为1分钟30秒

  • 表输出(批量插入5个线程批量大小3_000):每个线程平均每秒7_600行。指每秒约37000行。总时间约为59秒

  • Buld加载器的优点是它不会填充jmv的内存,所有数据都会立即流式传输到psql进程

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

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

  • 表输出(批量插入5个线程批量大小10_000):每个线程平均每秒12_500行。表示每秒大约60_000行。总时间约为35秒
  • 现在做决定容易多了。但您必须注意一个事实,kettle pdi和数据库位于同一台主机上。如果主机不同,网络带宽会对性能起到一定的作用

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

    让我们看看文档

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

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

    所以,如果这一步是瓶颈,那么,试着找出到底什么是慢的

    • 查找速度慢吗?(对样本数据在数据库上手动运行查找查询。检查是否很慢?查找字段在用于查找数据库中对应行的列上是否有索引)
    • 更新速度慢吗?(对样本数据在数据库上手动运行查找查询。检查是否很慢?update where子句是否在查找字段上使用索引)
    无论如何,这一步是缓慢的,因为它需要大量的网络通信和数据处理的水壶


    使其更快的唯一方法是将数据库中的所有数据加载到“temp”表中,并调用将上传数据的函数。或者使用简单的sql单步执行同样的操作。

    我不知道是否需要大容量加载程序,我知道的是插入/更新花费了太长的时间,150k行=27-33分钟,表输出只花了1秒,但只有在我只需要插入时才需要。对于更新删除,它没有用处。在不久的将来,我可能需要做更新或删除太,所以你能给我任何解决方案?谢谢。有关更新/删除,请查看
    合并行(差异)
    步骤。您的
    Insert/Update
    步骤可能很慢,因为基础表缺少索引。合并行(diff)与表输出相结合似乎可以。不过,我想知道如何使插入/更新更快,我已经在问题发生时设置了索引。谢谢Brian。
    合并行(差异)
    不应与
    表输出相结合
    ;合并后,它应与
    同步相结合
    。果阿