我必须知道数据传输作业(进程组内部的流)的状态是完成,失败还是正在运行。我想使用针对Web应用程序的nipyapi来做到这一点。
我在nifi中有一个进程组,在其中有nifi流。我正在使用nipyapi调度进程组:
nipyapi.canvas.schedule_process_group(id, True)
现在,我想使用nipyapi监视进程组的状态。根据状态,我特别想知道其是否仍在运行,失败或完成。
答案 0 :(得分:1)
NiFi并不真正具有可以检查其完成情况的工作概念。一旦启动了流程组中的所有组件,它们将无限期运行,直到有人停止它们。
“完成”或“完成”的概念实际上取决于您的数据流在做什么。例如,如果您的第一个处理器是GetFile,则该处理器运行后,它将监视目录中的文件,直到有人停止该处理器为止。在处理器运行时,它无法知道是否会有更多文件,或者是否已经查看了将被删除到目录中的所有文件。只有把文件放在那里的人或任何人都知道这种知识。
要确定故障,您需要在数据流中执行一些操作以捕获故障。大多数处理器都有故障关系,因此您需要将它们路由到某个地方并采取一些措施来跟踪故障。
答案 1 :(得分:0)
我认为我找到了解决这个问题的好方法。这就是我解决的方法。
所以我有一个mysql db,它基本上跟踪要传输的所有文件。数据库表将具有2列。一个代表文件名(可以说是唯一的),并标明文件是否已传输(True和False)。
For Nifi Screenshot click here
我们有3个处理器部分。
First: listSFTP and putMySQL
Second: getSFTP and putHDFS
Third: listHDFS and putHDFS
第一部分负责列出SFTP中的文件。它获取所有文件,并在mysql中添加一行,文件名为'X'和'False',表示尚未传输。
insert into NifiTest.Jobs values('${filename}', 0);
第三节对HDFS做同样的事情。它将以Transferred = True插入,或者如果已经存在具有相同文件名的行则更新。
insert into NifiTest.Jobs values('${filename}', 1) on duplicate key update TRANSFERRED = 1;
第二部分除了将文件发送到HDFS外什么也不做。
现在检查数据传输作业何时完成。
您将一起启动整个过程组。当查询数据库时,您将获得所有Transferred = 1,这意味着作业已完成。
似乎有些情况下它可能会失败,但是当您仔细考虑所有情况后,您会发现它可以解决所有情况。
让我知道我是否错了,或者可以对此解决方案进行一些改进。