heap-memory - 带有python的Nifi ExecuteScript:OOM异常
问题描述
一个触发器处理器->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 Nifi 1.9.2
解决方案
如果您正在将大文件读入内存,daggett
那么您可能会耗尽内存是正确的。
或者,我相信 Jython 中存在已知的内存泄漏,但我找不到我正在寻找的页面。您可以尝试在 bootstrap.conf 中将系统属性设置为python.options.internalTablesImpl
并weak
重新启动 NiFi。
作为另一种可能的选择,由于您的脚本不会太长,您可以将代码移植到 Groovy,它有许多与 Python 相似的习语,所以希望不会太复杂。
推荐阅读
- python - 在数据框中进行模糊匹配时如何处理 Nonetype?
- azure - 添加 Azure AD 后禁用 Azure 门户登录
- java - 慢速内存/签名扫描仪
- ansible - Ansible-在配置文件中查找没有匹配字符串的服务器并仅显示没有字符串的服务器
- c++ - 包含标准库中的任何内容后,CLion 中的语法突出显示和代码检查停止工作
- matlab - 保存具有特定维度 MATLAB 的子图
- javascript - 在 v-select 中实现 @blur
- swift - 将场景/USDZ 文件动态缩放到平面?
- django - 由 2 个模型组成的其他模型中的 Django 本地模型
- swift - Init 要求类型 T和 X: T是等价的