删除Nifi流文件内容的最快方法是什么?

时间:2018-11-15 03:37:03

标签: apache-nifi

我有一个工作流,我在其中获取json文件作为rest api的响应。我在一个会话中大约收到10万个文件。所有文件的总大小为15GB。我必须将每个文件保存到文件系统中。在该过程结束时,我必须等待所有文件出现,然后才能发送成功消息。

一旦我将文件保存在FS中,我就会调用notify + wait。但我不再需要flowfile中的15 GB数据。因此,为了释放空间,我想到了使用replaceText或ModifyByte清除内容。因此notify + wait运行顺利。等待此过程总共需要3个小时。

但是在两种情况下(replaceText或ModifyByte),过程都花费了太长时间。

您能建议一种清除流文件数据的最快方法吗?我也不需要任何属性。那是我可以放弃旧的流文件并在中途生成kb流文件的一种方法吗?

我想要的东西类似于generateflowfile,但是在中间,因此对于我现有的每个流文件,我都可以删除旧的流文件,并生成空白的流文件以进行通知和等待。

谢谢

1 个答案:

答案 0 :(得分:1)

NiFi的内容存储库和FlowFile存储库基于写时复制机制,因此,如果您不更改内容或元数据,则不必在这些处理器上“保留” 15GB。

话虽如此,如果您只需要磁盘上存在此类流文件(而不是内容或元数据),请尝试使用以下Groovy脚本执行ExecuteScript:

def flowFiles = session.get(1000)
flowFiles.each {
   session.transfer(session.create(), REL_SUCCESS)
}
session.remove(flowFiles)

此脚本一次最多可抓取1000个流文件,并且每个脚本向下游发送一个空的流文件。然后,它将删除所有原始的传入流文件。

请注意,这(即您的用例)将“破坏”出处/血统链,因此,如果流程中出现问题,您将无法分辨哪些流程文件来自哪些父流程文件,等等。这种限制是您看不到执行这种功能的完整处理器的原因之一。