我想设置一个NiFi工作流程,它可以提取大型JSON文档(500 MB到3 GB之间),这些文档已经从FTP服务器中解压缩,将JSON对象拆分为单独的流文件,最后转换每个JSON对象到SQL并将其插入MySQL数据库。
我在Oracle Java 8上运行NiFi 1.6.0,而Java的堆空间设置为1024 MB。
我目前的流程是:
GetFTP - > CompressContent - > SplitJson - > EvaluateJsonPath - > AttributesToJson - > ConvertJSONToSQL - > PutSQL
此流程适用于较小的JSON文档。一旦大于400 MB的文件进入SplitJson处理器,它就会抛出Java OutOfMemory
错误。我可以对现有流程进行哪些更改以使其能够处理大型JSON文档?
答案 0 :(得分:6)
通常,您希望避免拆分为每个文档的流文件。如果可以将多个文档放在一个流文件中,您将获得更好的性能。您将需要了解NiFi的记录处理功能,特别是您需要查看PutDatabaseRecord。
以下是记录处理方法的一个很好的介绍: https://www.slideshare.net/BryanBende/apache-nifi-record-processing
如果你必须执行拆分到每个流文件的单个记录,那么你应该至少执行两阶段拆分,其中第一个拆分处理器拆分为每个流文件10k-20k,然后是第二个拆分处理器每个流文件拆分为1个。