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

时间:2016-07-29 08:11:32

标签: java garbage-collection hortonworks-data-platform apache-nifi hortonworks-sandbox

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

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

我该如何解决这个问题?我尝试更改有关最大堆空间和其他与内存相关的属性的nifi配置,但似乎没有任何工作。

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

欢迎任何建议!谢谢

1 个答案:

答案 0 :(得分:5)

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

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