Apache NiFi - OutOfMemory Error: GC overhead limit exceeded on SplitText processor

Apache NiFi - OutOfMemory Error: GC overhead limit exceeded on SplitText processor

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

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

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

现在我添加了一个行数为 1K 的中间 SplitText,这让我避免了错误,但我不认为这是一个可靠的解决方案传入的文件大小可能会变得比这大得多,恐怕我会从处理器那里得到同样的行为。

欢迎任何建议!谢谢

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

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

我在 Apache NiFi 中使用 GetMongo 处理器时遇到了类似的错误。 我将配置更改为:

Limit: 100
Batch Size: 10

然后错误消失了。