JVM在nifi中耗尽内存异常

时间:2017-08-30 13:59:30

标签: apache-nifi

我不能使用任何处理器,因为它抛出异常,当我想清除连接队列时,它除了这样:0 FlowFiles(0字节)从队列中删除。

由于java.lang.IllegalStateException导致无法删除FlowFiles:无法更新存储库,因为此时所有分区都不可用。写入存储库会导致损坏。这通常是由于存储库耗尽磁盘空间或JVM耗尽内存而导致的。

2 个答案:

答案 0 :(得分:1)

NiFi与FlowFiles一起使用。存在的每个FlowFile都由两部分组成,即FlowFile内容和FlowFile属性。虽然FlowFile的内容位于内容存储库中的磁盘上,但NiFi会将FlowFile属性数据的“大部分”保存在已配置的JVM堆内存空间中。我之所以说“多数”,是因为NiFi确实会将属性交换到包含20,000个以上FlowFiles(默认设置,但可以在nifi.properties中更改)的任何队列上的磁盘上。

一旦您的NiFi报告了内存不足(OOM)错误,除了重新启动NiFi之外,没有其他纠正措施。如果未更改您的NiFi或数据流,那么您肯定会一次又一次地遇到此问题。

NiFi中JVM堆的默认配置仅为512 MB。此值在nifi-bootstrap.conf文件中设置。

# JVM memory settings
java.arg.2=-Xms3072m
java.arg.3=-Xmx8096m

NiFi已经具有内置机制来帮助减少总体堆占用空间。。当给定连接队列超过配置的阈值时,该机制会将FlowFiles属性交换到磁盘。这些设置位于nifi.properties文件中:

nifi.swap.manager.implementation=org.apache.nifi.controller.FileSystemSwapManager
nifi.queue.swap.threshold=20000
nifi.swap.in.period=5 sec
nifi.swap.in.threads=1
nifi.swap.out.period=5 sec
nifi.swap.out.threads=4

堆内存不足的一些常见原因包括:

  1. 大量数据流,在整个数据流中的任何给定时间都有大量FlowFiles处于活动状态。 (增加bootstrap.conf中配置的nifi堆大小以解决)

  2. 在每个FlowFile上创建大量属性。更多属性等于每个FlowFile使用更多堆。避免在FlowFiles上创建未使用/不必要的属性。 (增加bootstrap.conf中配置的nifi堆大小以解决和/或降低配置的交换阈值)

  3. 将较大的值写入FlowFile属性。提取大量内容并将其写入FlowFile的属性将导致大量的堆使用。尽量避免创建较大的属性。 (增加bootstrap.conf中配置的nifi堆大小以解决和/或降低配置的交换阈值)

  4. 使用MergeContent处理器合并大量的FlowFiles。 NiFi无法合并已交换的FlowFile,因此合并时,所有这些FlowFile的属性都必须在堆中。如果需要合并大量的FlowFile,请尝试使用两个彼此串联的MergeContent处理器。首先合并最多20,000个FlowFile,然后将第二个10,000 FlowFile合并到更大的包中。 (增加bootstrap.conf中配置的nifi堆大小也有帮助)

  5. 使用SplitText处理器将一个File拆分为大量的FlowFiles。在队列超过交换阈值之后,才发生大型连接队列的交换。在将它们提交到成功关系之前,SplitTEXT处理器将创建所有拆分的FiLowFiles。使用SpitText按行分割较大的传入FlowFile时最常见。在创建所有拆分之前,可能会用完堆内存。尝试串联使用两个SplitText处理器。首先将传入的FlowFiles拆分为大块,然后将其进一步拆分。 (增加bootstrap.conf中配置的nifi堆大小也有帮助)

信用:https://community.cloudera.com/t5/Community-Articles/How-to-address-JVM-OutOfMemory-errors-in-NiFi/ta-p/244431

答案 1 :(得分:0)

在这种情况下,听起来好像你的磁盘已满。您可以使用void seekToEnd(Collection<TopicPartition> partitions) 中的Java args提高分配给运行Apache NiFi的JVM的堆量。

bootstrap.conf

通常建议将content repositoryprovenance repositoryflowfile repository保留在不同的磁盘上,并为每个磁盘分配一个健康的存储空间。您可以为# JVM memory settings java.arg.2=-Xms4096m java.arg.3=-Xmx8192m 中的每个配置最大大小,以使其更快地老化数据。