使用连接处理大型 csv 文件时的 Clover ETL 性能问题

Clover ETL performance issue with processing large csv files with joins

我正在使用 CloverETL 工具读取超过 100,000 行的大型 csv 文件,t运行在将它们插入数据库之前从数据库中列出一些查找值table。

基本上我用过:

  1. 要读入文件的平面文件reader
  2. 后跟一些'Lookup Join'到t运行从数据库中提取一些值
  3. 然后一个'ExtHashJoin'到link上所有的数据(因为源码没有排序)
  4. 然后将记录插入数据库。

过程非常简单,适用于少量记录。但是当我尝试导入整个文件时,它只是 运行 内存不足(增加内存分配无济于事)。

我发现 ExtHashJoin 试图等到它加入所有记录后再开始插入它们,这似乎是问题所在,因为它必须将所有记录存储在内存中。我真的不需要那种行为。这些记录都是独立的,可以分批处理,例如一次每 1000 行,但我想不出办法让它这样做。

我也尝试设置不同的阶段值,但在开始插入第一条记录之前它仍然尝试连接所有值。

如何告诉平面文件 reader 分解记录并分批处理它们?

谢谢。

埃里克

没有简单的方法可以强制 FlatFileReader 组件分解记录并分批处理它们。不过,我可以提供一些小技巧来帮助您解决由 ExtHashJoin 组件引起的内存溢出问题:

  1. 正如您正确指出的那样,ExtHashJoin 组件会等待所有记录(来自从端口)在加入开始之前流入。通常,如果要加入的从端口记录的数量相当少,我们建议使用 ExtHashJoin 组件。如果不是这种情况,我建议使用 ExtMergeJoin 组件。没有缓存(与 ExtHashJoin 不同),因此处理速度明显更快。您可以为 ExtMergeJoin 组件应用与 ExtHashJoin 组件相同的 Master/Slave 键定义和映射。但是,您需要在图形中的 SimpleCopy 组件之前放置一个新的 ExtSort 组件,以便发送已排序的数据。排序键应与 ExtMergeJoin 组件中定义的主键一致。
  2. 如果数据的排序顺序在从 FlatFileReader 到 ExtHashJoin 组件的过程中没有发生任何变化,则可能有更简单的方法来减少内存消耗。尝试用新的 Combine 组件替换 ExtHashJoin 组件,并应用与 ExtHashJoin 组件相同的映射。 Combine 组件也避免缓存记录,并且不需要通过键连接,因此性能应该相当不错。

有关此主题的更多详细信息可以在 CloverETL 论坛上找到:http://forum.cloveretl.com/viewtopic.php?p=12926#p12926