【问题标题】:NiFi-1.0.0 - ExecuteSQL, Event DrivenNiFi-1.0.0 - ExecuteSQL,事件驱动
【发布时间】:2016-11-18 20:40:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: apache-nifi


    【解决方案1】:

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

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

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

    【讨论】:

    • 我尝试使用 MergeContent,但它会导致在几百万个流文件之后阻塞 nifi。
    • 我在队列上有 PriorityAttributePrioritizer,但只要你不等待数据包在队列中聚集,它们就不会 100% 有序,因此我的处理器正在启动事件有点早,还有文件要插入到数据库中。
    • 问题是,如果我使用 MonitorActivity,我无法区分文件。插入文件后,我需要运行聚合查询。
    • 如果我可以为 nifi 中的队列编写一个自定义优先级,那就太好了。例如,我将扩展 PriorityAttributePrioritizer,让处理器在队列中的所有数据都排序(升序、降序)之后从队列中读取。
    • 让数百万个流文件堆积起来并不是一个好主意。您可以使用一系列 MergeContent 处理器,每个处理器一次合并 1,000 或 10,000 个。
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2016-09-21
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多