我正在尝试使用 NiFi 使用 HDF 1.2 处理大型 CSV 文件(每个文件可能有数十亿条记录)。我已经实现了我的流程,对于小文件来说一切正常。
问题是,如果我尝试将文件大小增加到 100MB(1M 记录),我会得到一个java.lang.OutOfMemoryError: GC overhead limit exceeded
来自分割文本处理器负责将文件分割成单个记录。我已经搜索过了,这基本上意味着垃圾收集器执行的时间太长而没有获得太多的堆空间。我预计这意味着生成太多流文件的速度太快。
我该如何解决这个问题?我尝试更改 nifi 关于最大堆空间和其他内存相关属性的配置,但似乎没有任何效果。
现在我添加了一个中间体分割文本行数为 1K,这可以让我避免错误,但我不认为这是一个可靠的解决方案,因为当传入的文件大小可能会变得比这个大得多时,我担心我会得到相同的行为处理器。
欢迎任何建议!谢谢
错误的原因是当以行数 1 分割 1M 记录时,您正在创建 1M 流文件,这相当于 1M Java 对象。总的来说,使用两个 SplitText 处理器的方法很常见,可以避免同时创建所有对象。您可能可以在第一次分割时使用更大的分割大小,也许是 10k。对于 10 亿条记录,我想知道第三个级别是否有意义,从 1B 分割到 10M,然后 10M 分割到 10K,然后 10K 分割到 1,但我必须使用它。
需要考虑的一些其他事项包括将默认堆大小从 512MB 增加(您可能已经这样做了),以及确定是否确实需要拆分为 1 行。如果不了解有关流程的任何其他信息,就很难说,但在很多情况下,如果您想将每一行传送到某个地方,您可能会有一个处理器读取大型分隔文件并将每一行流式传输到目的地。例如,PutKafka 和 PutSplunk 就是这样工作的,它们可以获取一个 1M 行的文件,并将每一行流式传输到目的地。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)