使用NiFi Flowfiles作为事件通知程序

时间:2017-05-17 21:43:40

标签: apache-nifi

NiFi的新手!

我想知道是否有办法在NiFi的流文件中发送带有属性的空流文件?我想将此作为触发器来指示某种类型的事件已经开始。

在NiFi中,还有其他任何方式可以表明一系列事件已经开始并完成了吗?例如,如果我有三个读入数据的处理器,我想知道第一个处理器即将被触发,而最后一个处理器已经完成。反正我还能这样做吗?如果处理器继续运行,我希望能够一次性将从处理器1读取的数据分组到处理器3。为了使这更清楚

Begin
Processor1
Processor2
Processor3
End
Begin
Processor1
Processor2
Processor3
End
...

任何帮助将不胜感激, 提前谢谢!

1 个答案:

答案 0 :(得分:9)

我打算将这个答案分成几个部分,因为这里有很多内容。

  

我想知道是否有办法发送空的流文件   NiFi中流文件的属性?我想用它作为触发器   表示某种类型的事件已经开始。

GenerateFlowFile处理器允许您以常规运行计划或使用CRON计划发送空(或填充)流文件。您可以将其与UpdateAttribute处理器结合使用,以将任意静态或动态属性添加到流文件中。

  

在NiFi中,还有其他任何方式可以表明一系列事件   已经开始并完成了?例如,如果我有三个处理器   读入数据,我想知道第一个处理器是   即将被触发并且最后一个处理器已经完成。是   无论如何,我这样做?

这接近批量处理,Apache NiFi并未设计或优化。确定处理器“即将被触发”非常困难。如果基于定时器/ CRON触发该处理器,您可以知道该时间,但如果您的意思是“GetFile即将成功检索文件”,那就不容易了。可以使用您自己的自定义处理器扩展处理器,并覆盖onTrigger()方法以将某些值存储在另一个处理器可以接收的DistributedMapCacheClientService中。或者我想你可以将逻辑包装在ExecuteScript处理器中并编写自定义通知代码。我不确定目标在这里 - 收到有关此状态更改的通知?它是另一个处理器,人类​​观察者还是外部服务?

  

如果处理器继续运行,我希望能够分组   数据在一次通过中从处理器1读取到处理器3。要做   这个更清楚

     

Begin Processor1 Processor2 Processor3 End Begin Processor1 Processor2 Processor3 End ...

但是,我相信使用新的WaitNotify处理器可以满足您的要求。 Koji Kawamura撰写了一篇描述其用途的好文章here

我认为在这种情况下,您需要特殊的内容或属性才能检测通过系统的批次,除非它一次只是一个数据单元。我将尝试描述下面的两个场景,但我没有太多关于此的背景。

场景1(单个数据单元)

随意替换不同的源处理器,但为了简单起见,我使用的是GetFile

假设您有一个充满文本文件的目录(由某些外部进程放置在那里)。每个文件都包含“Firstname Lastname”形式的文本,并命名为Lastname_YYYY-MM-DD-HH-mm-ss.txt,其中写入的时间戳填充文件名。

GetFile -> ReplaceText -> PutFile

GetFile处理器将每个文件作为单独的流文件引入。从那里,ReplaceText可以做一些简单的事情,比如使用正则表达式来切换名称的顺序,PutFile将内容写回文件系统。第一次触发GetFile时,它会将 n 流文件发送到ReplaceText的连接/队列。如果您希望它等待并线性执行操作而不是并行执行操作,则可以将成功队列的背压设置为1流文件,以防止前一个处理器({{1}从运行直到队列再次为空。

场景2(必须将多个流文件组合在一起并一起操作)

在这里,您需要使用GetFile将多个流文件收集到一个流文件中。您可以将bin阈值设置为 n 流文件,MergeContent处理器只有在达到传入流文件的最小数量时才会传输 success 流文件。您还可以按属性进行分区,因此,如果您从异构输入源进行读取,则仍可以基于共同特征关联相关的数据片段。

MergeContent&的替代场景Wait

此外,您可以使用Notify处理器将触发器流文件发送到相应的Notify处理器,以将“内容”流文件“释放”到其所需目标。同样,Koji上面链接的文章通过示例流程和一些屏幕截图详细解释了这一点。

我希望这至少可以为你提供一个方向。如果没有更多上下文,我仍然会感觉到你在这里尝试解决非NiFi问题,或者可能会调整你的数据流模型以更好地支持流式传输心态。如果您有更多信息,我很乐意扩大答案。