Apache nifi ApacheNIFI:我如何知道或检查所有流文件是否已被处理

Apache nifi ApacheNIFI:我如何知道或检查所有流文件是否已被处理,apache-nifi,Apache Nifi,我在NiFi有流量: Download file -> UnpackContent -> PutHDFS 在所有流文件放入HDFS之后,我需要运行shell脚本 如何知道或检查所有流文件是否已被处理?没有好的方法可以做到这一点,因为NiFi是一种流处理产品-它不断地从一个或多个点读取文件,处理它们并发送到另一个点 因此,不存在处理NiFi中所有文件的过程,因为流将继续运行并等待新文件 您可以做的是查询出处存储库,查看特定的流文件并检查它是否完成了流 因此,我建议做的是: 如果您知道

我在NiFi有流量:

Download file -> UnpackContent -> PutHDFS
在所有流文件放入HDFS之后,我需要运行shell脚本


如何知道或检查所有流文件是否已被处理?

没有好的方法可以做到这一点,因为NiFi是一种流处理产品-它不断地从一个或多个点读取文件,处理它们并发送到另一个点

因此,不存在处理NiFi中所有文件的过程,因为流将继续运行并等待新文件

您可以做的是查询出处存储库,查看特定的流文件并检查它是否完成了流

因此,我建议做的是:

如果您知道您希望处理的文件数量:查询出处存储库中完成流程的文件数量


如果您不知道:查询上次向HDFS写入新文件的时间,如果超过X秒,则运行脚本。

@АцццБц

您应该能够检查fragment.index和fragment.count的流文件属性

此值用于指示每个解包流文件是解包序列中的哪个部分。这就是您如何知道它们是在HDFS中处理的。在使用ExecuteScript之前,需要根据计数执行MergeContent或Wait/Notify进程。如果需要返回有关HDFS中零件位置的元数据,还可以在ExecuteScript中访问这些。我建议使用后者,因为您可能需要在流程的最后一步中出于充分的理由对结果进行解压缩

我已经为您创建了一个内容演示模板,您可以在我的GitHub上找到:


NiFi提供了起源事件日志存储库,其中包括集群中每个流文件上发生的所有操作的信息

在此处阅读有关出处日志以及如何使用日志的更多信息: Nifi处理器写入
片段.标识符
片段.计数
属性。Nifi处理器可以使用
合并策略=碎片整理
自动处理这些属性。因此,您可能有以下流程:

UnpackContent -> PutHDFS -> AttributesToJSON -> MergeContent -> ... 
删除流文件内容时需要使用
AtributesToJSON
,并且不会对
MergeContent
造成性能损失

MergeContent
将自动合并与单个存档相关的所有流文件


或者,您可以基于
fragment.identifier
&
fragment.count
属性和
Wait
/
Notify
处理器来实现自己的逻辑。但我认为,
MergeContent
选项对您的情况更为方便。

@АааБаааааа为您提供了解决方案。这是一个有效的解决方案,目前我正在使用非常类似的解决方案