Apache NiFi – OutOfMemory错误:SplitText处理器超出了GC开销限制

我正在尝试使用NiFi使用HDF 1.2处理大型CSV文件(每个可能有数十亿条记录)。 我实现了我的流程,一切都适用于小文件。

问题是如果我尝试将文件大小推到100MB(1M记录),我会得到一个java.lang.OutOfMemoryError: GC overhead limit exceeded从负责将文件拆分为单个记录的SplitText处理器java.lang.OutOfMemoryError: GC overhead limit exceeded 。 我已经搜索过了,它基本上意味着垃圾收集器执行的时间太长而没有获得太多的堆空间。 我希望这意味着太多的流文件生成得太快了。

我怎么解决这个问题? 我已经尝试改变nifi关于最大堆空间和其他与内存相关的属性的配置,但似乎没有任何效果。

现在我添加了一个行数为1K的中间SplitText ,这可以让我避免错误,但我不认为这是一个可靠的解决方案,当传入的文件大小可能远远超过这个时,我担心我将从处理器获得相同的行为。

欢迎任何建议! 谢谢

出错的原因是,当使用行数1分割1M记录时,您将创建1M流程文件,这些文件等同于1M Java对象。 总的来说,使用两个SplitText处理器的方法很常见,并且避免同时创建所有对象。 您可以在第一次拆分时使用更大的拆分尺寸,可能是10k。 对于十亿个记录,我想知道第三级是否有意义,从1B分为10M,然后从10M分到10K,然后从10K分到1,但我必须要玩它。

还需要考虑的其他一些事情是将默认堆大小从512MB(您可能已经完成)增加,并且还要确定是否确实需要拆分为1行。 如果你不知道关于流程的任何其他内容,很难说,但在很多情况下,如果你想在某个地方交付每一行,你可能会有一个处理器读取一个大的分隔文件并将每一行流到目的地。 例如,这就是PutKafka和PutSplunk的工作方式,它们可以获取包含1M行的文件,并将每行传输到目标。