Apache nifi NiFi-1.0.0-ExecuteSQL,事件驱动

Apache nifi NiFi-1.0.0-ExecuteSQL,事件驱动,apache-nifi,Apache Nifi,我有一个NiFi流,它将一些数据插入到一些表中。在向表中插入一些数据后,我发送一个信号,然后ExecuteSQL对该表运行聚合查询。表名基于文件名 问题是,当ExecuteSQL运行查询时,我只得到结果的一个子集。若在数据库控制台中运行相同的查询,则返回的行数不同 这可能是一个与事件驱动的调度策略有关的问题吗 如果ExecuteSQL被停止,并且我在ExecuteSQL的队列中获得流文件(信号),然后我手动启动ExecuteSQL,我将返回预期结果。如果您正在运行多个插入(例如使用PutSQL)

我有一个NiFi流,它将一些数据插入到一些表中。在向表中插入一些数据后,我发送一个信号,然后ExecuteSQL对该表运行聚合查询。表名基于文件名

问题是,当ExecuteSQL运行查询时,我只得到结果的一个子集。若在数据库控制台中运行相同的查询,则返回的行数不同

这可能是一个与事件驱动的调度策略有关的问题吗


如果ExecuteSQL被停止,并且我在ExecuteSQL的队列中获得流文件(信号),然后我手动启动ExecuteSQL,我将返回预期结果。

如果您正在运行多个插入(例如使用PutSQL),并且您希望仅在所有插入都完成后运行ExecuteSQL,它们完成的顺序并不确定,您可以尝试以下两种方法之一:

  • MergeContent-在PutSQL之后使用MergeContent处理器,设置插入完成时要触发的最小条目数和/或最大仓位。您可以将合并的关系路由到ExecuteSQL

  • MonitorActivity-使用MonitorActivity处理器监视PutSQL的输出流,并在配置的时间段后触发非活动警报。您可以将非活动关系路由到ExecuteSQL以运行聚合查询


如果您正在运行多个插入(例如使用PutSQL),并且希望仅在所有插入都完成后运行ExecuteSQL,并且它们完成的顺序不确定,则可以尝试以下两种方法之一:

  • MergeContent-在PutSQL之后使用MergeContent处理器,设置插入完成时要触发的最小条目数和/或最大仓位。您可以将合并的关系路由到ExecuteSQL

  • MonitorActivity-使用MonitorActivity处理器监视PutSQL的输出流,并在配置的时间段后触发非活动警报。您可以将非活动关系路由到ExecuteSQL以运行聚合查询


我曾尝试使用MergeContent,但它会在数百万个流文件之后阻塞nifi。我在队列上有PriorityAttributePriorizer,但只要您不等待数据包聚集在队列中,它们就不会100%正常,因此,我的处理器会提前一点启动事件,但数据库中仍有文件要插入。问题是,如果我使用MonitorActivity,我无法区分这些文件。插入一个文件后,我需要运行一个聚合查询。如果我能在nifi中为队列编写一个自定义的优先级排序器,那就太好了。例如,我将扩展PriorityAttributePriorizer,让处理器在对队列中的所有数据进行排序(升序、降序)后从队列中读取数据。让数百万个流文件堆叠在一起很少是个好主意。您可能会使用一系列MergeContent处理器,每个处理器一次合并1000或10000个。我曾尝试使用MergeContent,但这会导致在数百万个流文件之后阻塞nifi。我在队列上有PriorityAttributePriorizer,但只要您不等待数据包聚集在队列中,它们就不会100%有序,因此,我的处理器会提前一点启动事件,但数据库中仍有文件要插入。问题是,如果我使用MonitorActivity,我无法区分这些文件。插入一个文件后,我需要运行一个聚合查询。如果我能在nifi中为队列编写一个自定义的优先级排序器,那就太好了。例如,我将扩展PriorityAttributePriorizer,让处理器在对队列中的所有数据进行排序(升序、降序)后从队列中读取数据。让数百万个流文件堆叠在一起很少是个好主意。您可以使用一系列MergeContent处理器,每个处理器一次合并1000或10000个。