首页 > 解决方案 > 带有 Groovy 的 Nifi ExecuteScript:OOM 异常

问题描述

我在 NiFi 中使用 ExecuteScript 处理器使用我指定的流文件执行 PUT 命令。但是,现在当文件大于 2GB 时,我得到了 OutOfMemory 异常。我在 NiFi 上的内存设置要高得多。我还看到更大的流文件可以与其他一些提供的 Nifi 处理器一起使用。

我不能使用 InvokeHTTP,因为我有 2 个不同的返回码,它们的关系相互冲突,需要处理。

目前我对 NiFi 的 JVM 设置是

java.arg.2=-Xms16g
java.arg.3=-Xmx32g

这是数据如何被 PUT 的片​​段。

    InputStream i = session.read(flowFile)
    def baseUrl = new URL(Location)
    def connection = baseUrl.openConnection()
    connection.setDoOutput(true)
    connection.setRequestMethod('PUT')
    connection.connect()

    OutputStream os = connection.getOutputStream()
    os << i
    i.close()

    os.flush()
    os.close()

NiFi中是否需要设置groovy设置以增加此内存限制?当前运行 NiFi 1.9.2

标签: javagroovyapache-nifi

解决方案


使用输入流读取缓冲区并添加 ChunkedStreamingMode 解决了问题

connection.setChunkedStreamingMode(1024)
byte[] buffer = new byte[1024];
int len;
while ((len = i.read(buffer)) != -1) {
    os.write(buffer, 0, len);
    os.flush;
}

推荐阅读