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

ric*_*ini 4 java garbage-collection hortonworks-data-platform apache-nifi hortonworks-sandbox

我正在尝试使用NiFi使用HDF 1.2处理大型CSV文件(每个文件可能包含数十亿条记录)。我已经实现了流程,所有小文件都可以正常工作。

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

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

现在,我添加了一个行数为1K 的中间SplitText,这使我避免了该错误,但是对于传入的文件大小可能变得远远超过此数目的情况,我不认为这是一个可靠的解决方案我将从处理器获得相同的行为。

任何建议都欢迎!谢谢

Bry*_*nde 5

发生此错误的原因是,当分割1M行数为1的记录时,您正在创建等于1M Java对象的1M流文件。总的来说,使用两个SplitText处理器的方法很常见,并且避免了同时创建所有对象。您可能会在第一个分割上使用更大的分割大小,也许是10k。对于十亿条记录,我想知道第三个级别是否有意义,从1B拆分为10M,然后从10M拆分为10K,然后从10K拆分为1,但是我必须使用它。

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