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

Apache nifi 如何在nifi队列中获取流文件计数?,apache-nifi,Apache Nifi,我有nifi流(独立)像 对于每个传入的流文件,配置单元脚本使用INSERT..INTO..SELECT..FROM命令运行,hadoop脚本从存储区域删除特定文件 有时,当hadoop脚本同时运行该命令时,配置单元脚本会失败 我将得到每小时最多4个文件的数量。所以我计划在hive和hadoop处理器之间使用controlrate处理器。我设置了当队列计数达到4 flowfile时的条件,然后应该执行hadoop脚本。但是,controlrate具有仅为最大速率设置的属性。它没有最低利率 有没有

我有nifi流(独立)像

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

有时,当hadoop脚本同时运行该命令时,配置单元脚本会失败

我将得到每小时最多4个文件的数量。所以我计划在hive和hadoop处理器之间使用controlrate处理器。我设置了当队列计数达到4 flowfile时的条件,然后应该执行hadoop脚本。但是,controlrate具有仅为最大速率设置的属性。它没有最低利率

有没有可能的解决办法?或任何其他解决方案?

您应该能够使用此方法,请尝试以下Groovy脚本:

def flowFiles = session.get(4)
if(!flowFiles || flowFiles.size() < 4) {
  session.rollback()
} else {
  session.transfer(flowFiles, REL_SUCCESS)
}
def flowFiles=session.get(4)
如果(!flowFiles | | flowFiles.size()<4){
会话。回滚()
}否则{
会话.传输(流文件,REL_SUCCESS)
}
如果只想触发下游流一次,则可以从父流创建子流文件(并报告加入来源事件):

def flowFiles=session.get(4)
如果(!flowFiles | | flowFiles.size()<4){
会话。回滚()
}否则{
def flowFile=session.create(流文件)
session.provenanceReporter.join(流文件,流文件)
会话.删除(流文件)
session.transfer(流文件,REL_SUCCESS)
} 
话虽如此,如果您不关心流文件内容(即使用流文件作为触发器),您可以使用最小和最大条目数=4。

您应该能够使用此功能,请尝试以下Groovy脚本:

def flowFiles = session.get(4)
if(!flowFiles || flowFiles.size() < 4) {
  session.rollback()
} else {
  session.transfer(flowFiles, REL_SUCCESS)
}
def flowFiles=session.get(4)
如果(!flowFiles | | flowFiles.size()<4){
会话。回滚()
}否则{
会话.传输(流文件,REL_SUCCESS)
}
如果只想触发下游流一次,则可以从父流创建子流文件(并报告加入来源事件):

def flowFiles=session.get(4)
如果(!flowFiles | | flowFiles.size()<4){
会话。回滚()
}否则{
def flowFile=session.create(流文件)
session.provenanceReporter.join(流文件,流文件)
会话.删除(流文件)
session.transfer(流文件,REL_SUCCESS)
} 

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

我将在一个位置获得4个流文件。我将获取这些文件中的每一个,路由到配置单元脚本(executestreamprocessor)和hadoop脚本(executestreamprocessor)。基本上,我将通过配置单元脚本和hadoop脚本处理每个文件,以删除所有文件。但我不想单独删除这些文件。在这里,我认为executescript(groovy)和mergecontent不适合。请进一步说明。脚本是否已经知道要删除哪些文件(与文件夹中的所有文件一样)?如果是这样,第二个脚本应该可以工作,将它放在配置单元脚本之后,Hadoop ExecuteStream命令之前,然后您将得到4个配置单元命令,然后一个Hadoop Delete是否可以检查第二个脚本的其他关系的条件?我不确定您的意思,您是指脚本中的错误处理吗?假设,我有1.executestreamcommand(运行配置单元脚本)和2.executestreamcommand(运行配置单元脚本)以及3.executestreamcommand(运行配置单元脚本)和4.executestreamcommand(运行hadoop命令)。我希望hadoop命令仅在第一个executestreamcommand队列为空时执行。在这种情况下,我们需要检查第一个处理器的队列。有可能吗?我将在一个位置获得4个流文件。我将获取这些文件中的每一个,路由到配置单元脚本(executestreamprocessor)和hadoop脚本(executestreamprocessor)。基本上,我将通过配置单元脚本和hadoop脚本处理每个文件,以删除所有文件。但我不想单独删除这些文件。在这里,我认为executescript(groovy)和mergecontent不适合。请进一步说明。脚本是否已经知道要删除哪些文件(与文件夹中的所有文件一样)?如果是这样,第二个脚本应该可以工作,将它放在配置单元脚本之后,Hadoop ExecuteStream命令之前,然后您将得到4个配置单元命令,然后一个Hadoop Delete是否可以检查第二个脚本的其他关系的条件?我不确定您的意思,您是指脚本中的错误处理吗?假设,我有1.executestreamcommand(运行配置单元脚本)和2.executestreamcommand(运行配置单元脚本)以及3.executestreamcommand(运行配置单元脚本)和4.executestreamcommand(运行hadoop命令)。我希望hadoop命令仅在第一个executestreamcommand队列为空时执行。在这种情况下,我们需要检查第一个处理器的队列。可能吗?
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)
}