【问题标题】:Nifi ExecuteScript with python: OOM exception带有python的Nifi ExecuteScript:OOM异常
【发布时间】:2019-11-15 09:33:03
【问题描述】:

一个触发器处理器->GenerateTableFetch->ExecuteSQLRecord->UpdateAttribute->ExecuteScript(python)->.... 如图

但是在 ExecuteScript 中出现 OutOfMemory 异常,我该怎么办?TIA

日志

2019-11-15 16:37:33,466 ERROR [pool-14-thread-1] o.a.n.c.r.WriteAheadFlowFileRepository Unable to checkpoint FlowFile Repository due to java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

脚本

import json
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback
class PyStreamCallback(StreamCallback):
    def __init__(self, flowfile):
        self.ff = flowfile
        pass

    def process(self, inputStream, outputStream):
        # prop_col_names = self.ff.getAttribute('prop_col_names')

        prop_col_names = ['FACTORYNO']
        text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
        obj = json.loads(text)

        results_prop = []
        results_basic = []

        for row in obj:
            main_id= row['COMBINEPICKUPNO']
            # main_prop_table
            for col_name in prop_col_names:
                # TODO: read from variable
                d = {}
                if col_name == 'FACTORYNO':
                    d = {'VALUE': row[col_name],
                         'ID': col_name,
                         }
                results_prop.append(d)
            # TODO: read from variable
            basic_info = {
                'ID': main_id,
            }
            results_basic.append(basic_info)

            results_pxp.append(pxp_info)
        data = {
            'prop': results_prop,
            'basic': results_basic
        }
        outputStream.write(bytearray(json.dumps(data, separators=(',', ':')).encode('utf-8')))

flowFile = session.get()
if (flowFile != None):
    flowFile = session.write(flowFile, PyStreamCallback(flowFile))
    session.transfer(flowFile, REL_SUCCESS)

Java 1.8 尼菲 1.9.2

【问题讨论】:

  • 使用以下行IOUtils.toString(inputStream, StandardCharsets.UTF_8),您尝试将完整的流文件内容加载到内存中 - 这会让您内存不足...要建议您 - 我们必须了解您的目标。

标签: heap-memory apache-nifi


【解决方案1】:

如果您将大文件读入内存,daggett 是正确的,您可能会耗尽内存。

另外,我相信 Jython 中存在已知的内存泄漏,但我找不到我正在寻找的页面。您可以尝试在bootstrap.conf中将系统属性python.options.internalTablesImpl设置为weak并重启NiFi。

作为另一种可能的选择,由于您的脚本不会太长,您可以将代码移植到 Groovy,它有许多与 Python 相似的习语,所以希望不会太复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多