如何在CRON驱动的DetectDuplicate中摄取所有流文件?

如何在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_

在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_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运行的原因。)

    如果my
    DetectDuplicate
    处理器是“计时器驱动”调度的,则到达队列的第一个流文件将在所有流文件到达之前被处理器消耗

    这将破坏全套流文件的顺序

    我觉得在
    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的第一个流程文件