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

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

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

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

任何建议都欢迎!谢谢

最佳答案

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

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

关于java - Apache NiFi-内存不足错误: GC overhead limit exceeded on SplitText processor,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38653745/

10-10 23:57