如何在CRON驱动的DetectDuplicate中摄取所有流文件?
在NiFi中,我有一个cron驱动的处理器序列,它每天提供一组流文件,其中包含我感兴趣的两个属性:如何在CRON驱动的DetectDuplicate中摄取所有流文件?,cron,duplicates,priority-queue,apache-nifi,Cron,Duplicates,Priority Queue,Apache Nifi,在NiFi中,我有一个cron驱动的处理器序列,它每天提供一组流文件,其中包含我感兴趣的两个属性:product\u code和publication\u date 我需要的是每个产品\u code只保留一个流文件:一个具有最新出版日期的流文件 例: 对于此输入: flow_1: product_code: A / publication_date : 2018-01-01 flow_2: product_code: B / publication_date : 2018-01-01 flow_
product\u code
和publication\u date
我需要的是每个产品\u code
只保留一个流文件:一个具有最新出版日期的流文件
例:
对于此输入:
flow_1: product_code: A / publication_date : 2018-01-01
flow_2: product_code: B / publication_date : 2018-01-01
flow_3: product_code: C / publication_date : 2018-01-01
flow_4: product_code: A / publication_date : 2018-04-12
flow_5: product_code: A / publication_date : 2000-12-31
flow_6: product_code: B / publication_date : 2018-02-02
flow_7: product_code: B / publication_date : 2018-03-03
预期产出应为:
flow_3: product_code: C / publication_date : 2018-01-01
flow_4: product_code: A / publication_date : 2018-04-12
flow_7: product_code: B / publication_date : 2018-03-03
我测试的算法
使用UpdateAttribute
处理器根据发布日期
向每个流文件添加属性优先级
这些更新的流文件被重定向到priorityAttributePriorizer
队列
流文件保留在此队列中,因为只有一个使用处理器,它是cron驱动的。通过这种方式,我确信队列中的流文件是根据发布日期
排序的
然后CRON触发下一个处理器,一个基于product\u code
属性的DetectDuplicate
。由于流程文件是从最新的项目处理到最旧的项目,我确信当检测到产品\u代码
重复时,这是因为相同的产品\u代码
在较新的发布日期
中已经正常
问题
不幸的是,当cron触发detectdupplicate
处理器时,只有一条消息被使用,其他消息留在队列中
如果我将“调度策略”更改为“计时器驱动”,并且“运行调度”为0,那么我的所有流文件都将被消耗,并且输出符合预期
有没有办法让我的DetectDuplicate
处理器在队列开始工作时使用队列中的所有消息(而不仅仅是一条消息)
或者有没有一种方法可以设置一个调度策略,比如“凌晨2:00开始工作,凌晨4:00停止”
你认为有更好的策略来满足需求吗
问候,
瓦尔
更新1
(2018-04-13)除布赖恩·本德的评论外,还有更多信息
我知道CRON不是最好的解决方案,但我不知道如何改进我的算法来摆脱它
在我的例子中,排队等待重复数据消除的流文件是通过3个REST调用序列生成的:
- 第一次调用“GetAllCategories”
- 然后,对于每个类别,调用“GetSubCategories”
- 对于每个子类别,调用“GetProducts”李>
此流文件生成部分通常持续5分钟左右:昨晚第一个流文件在凌晨2:00:16到达队列,最后一个流文件在凌晨2:04:58到达队列。(这就是我将DetectDuplicate
安排在凌晨3:00运行的原因。)
如果myDetectDuplicate
处理器是“计时器驱动”调度的,则到达队列的第一个流文件将在所有流文件到达之前被处理器消耗
这将破坏全套流文件的顺序
我觉得在DetectDuplicate
处理器开始工作之前,我必须等待所有流文件进入队列
您有改进我的算法的潜在建议吗?您通常应该对启动流的源处理器使用CRON调度,然后所有其他处理器都应该使用运行调度为0的计时器驱动
例如,如果您每天凌晨2:00从目录中拾取文件,那么应该使用CRON表达式调度GetFile,以便在凌晨2:00启动流,但除此之外,任何内容都不需要CRON调度,因为除非运行GetFile,否则它们永远不会接收数据
如果希望处理器等待执行直到所有流文件可用,则可以使用等待/通知处理器,这样,所有流文件在释放到DetectDuplicate处理器之前都在等待处理器前建立。只有一条消息被使用的原因是,当您在所有处理器(源处理器和使用/dowstream处理器)中启用了CRON
调度时,它的执行方式如下:
Ex:您已在所有处理器中设置了每天下午2点运行的CRON计划,因此在触发期间,它将在下午2点从其上游处理器Ex:GetFile
消耗一个流文件,其余流文件将在队列中,下一个流文件将仅在第二天下午2点消耗,依此类推。这也适用于更进一步的下游处理器,也就是说,他们每天下午2点一次只消耗flowfile,这基本上是一场灾难。谁想让处理过程慢如蜗牛
这就是为什么你必须遵循@Bryan提到的方法。flow pipeline的源处理器应仅为CRON驱动的
,其余处理器应为定时器驱动的
,运行计划如您所愿,但通常0秒
用于在流文件出现时使用它。感谢您的回复Bryan。我知道CRON不是最好的解决方案,但我不知道如何改进我的算法来摆脱它。我刚刚更新了我的问题,添加了关于您答案的评论。@据我所知,DetectDuplicate一次只对一个流文件进行操作。它获取一个流文件,并使用一些标识符来对照以前看到的标识符的缓存进行检查,并且每次对每个流文件执行一个检查。所以我认为你不需要让所有的流文件在处理器前等待,你只需要在CRON上安排GetAllCategories,其他所有的定时器。当你描述DetectDuplicate的行为时,你是对的@BryanBende。但让我澄清一下情况:1/执行GetAllCategories。2/First getProduct返回“product:A/publication_date:2000-01-01
”3/此流程文件输入检测到的副本,因为它是pr的第一个流程文件