如何在nifi队列中获取流文件计数?

时间:2017-05-05 07:14:10

标签: apache-nifi

我有像nifi流(独立)

executestreamprocessor(hive script) -> executestreamprocessor(hadoop script).

对于每个传入的流文件,hive脚本使用命令INSERT..INTO..SELECT..FROM运行,hadoop脚本从存储区域删除特定文件。

有时,当hadoop脚本同时运行命令时,hive脚本会失败。

我每小时最多可获得4个文件。所以我计划在蜂巢和hadoop处理器之间使用控制处理器。我在队列计数达到4个flowfile时设置条件,然后执行hadoop脚本。但是,controlrate具有仅为最大速率设置的属性。它没有最低费率。

有没有可能实现的解决方案?或任何其他解决方案?

1 个答案:

答案 0 :(得分:2)

您应该可以使用ExecuteScript来试试这个Groovy脚本:

def flowFiles = session.get(4)
if(!flowFiles || flowFiles.size() < 4) {
  session.rollback()
} else {
  session.transfer(flowFiles, REL_SUCCESS)
}

如果您只想触发下游流程一次,那么您可以从父项创建子流文件(并报告JOIN来源事件):

def flowFiles = session.get(4)
if(!flowFiles || flowFiles.size() < 4) {
  session.rollback()
} else {
  def flowFile = session.create(flowFiles)
  session.provenanceReporter.join(flowFiles, flowFile)
  session.remove(flowFiles)
  session.transfer(flowFile, REL_SUCCESS)
} 

话虽如此,如果您不关心流文件内容(即您使用流文件作为触发器),您可以使用MergeContent,其最小和最大条目数= 4。