Apache nifi 合并文件时nifi-1.0.0块

Apache nifi 合并文件时nifi-1.0.0块,apache-nifi,Apache Nifi,我有一个处理csv文件的流程(最大文件大小约700 mB)。 我将这些文件拆分为一行的flowfiles,然后进行一些处理,最后使用[Extended]MergeContent processor作为同步机制。 问题是,如果我处理每个csv文件,当它们在MergeContent的队列中时,它将阻止nifi实例 当我有超过150万个文件时,它会阻止 Nifi运行在一台服务器上(32核,约200 GB的RAM)。Nifi堆大小64或128出现相同问题 知道为什么会这样吗 如果我处理5个小的csv文件

我有一个处理csv文件的流程(最大文件大小约700 mB)。 我将这些文件拆分为一行的flowfiles,然后进行一些处理,最后使用[Extended]MergeContent processor作为同步机制。 问题是,如果我处理每个csv文件,当它们在MergeContent的队列中时,它将阻止nifi实例

当我有超过150万个文件时,它会阻止

Nifi运行在一台服务器上(32核,约200 GB的RAM)。Nifi堆大小64或128出现相同问题

知道为什么会这样吗

如果我处理5个小的csv文件,没有问题,处理器工作正常

[Extended]MergeContent是一个继承MergeContent的处理器,它等待所有文件打包,然后向下一个处理器发送信号。它并不构成整个文件。
例如,如果我的CSV文件由一行1000 000个流文件组成,那么[Extended]MergeContent将只发送1000 000个流文件中的一个,作为下一个处理器的信号。

我一直在处理类似的情况,并尝试以同样的方式在粒度级别上使用NiFi处理这么多文件

在我的特殊情况下,这给垃圾收集器带来了太大的压力,无论我有多少内存,或者我花了多少时间在GC调优上,G1都会定期触发完整的GC。您可以查看右上角的摘要部分,然后查看系统诊断以显示gc统计信息,检查这是否是与垃圾收集器相关的问题

我可以建议您一起重新设计您的流程和批处理行,以便最终得到更少的流程文件。另一种选择是随时限制流中的流文件数量,对队列施加反向压力,但由于您使用的是EMC处理器作为同步机制,我不知道这是否可行


希望这有助于

我一直在处理类似的情况,并以同样的方式尝试在这么多文件的粒度级别上使用NiFi

在我的特殊情况下,这给垃圾收集器带来了太大的压力,无论我有多少内存,或者我花了多少时间在GC调优上,G1都会定期触发完整的GC。您可以查看右上角的摘要部分,然后查看系统诊断以显示gc统计信息,检查这是否是与垃圾收集器相关的问题

我可以建议您一起重新设计您的流程和批处理行,以便最终得到更少的流程文件。另一种选择是随时限制流中的流文件数量,对队列施加反向压力,但由于您使用的是EMC处理器作为同步机制,我不知道这是否可行


希望这有帮助

我不确定我是否理解您的场景--这个新的“EMC”处理器不是将多个流文件合并回单个流文件,而是等待所有流文件完成,然后只向后续组件发送一个(任意)流文件?通用聚合器组件有一个open for a general purpose aggregator component(开放式聚合器组件)和一个可满足您需要的组件。如果它由于大量流文件而阻塞,您应该检查此处理器如何遵守
产量持续时间
调度策略
配置选项。如果此处理器除了等待
x
flowfiles之外,实际上不执行任何逻辑,那么它可能应该具有
事件驱动的
调度策略
,因此不会不必要地运行。使用
ExecuteScript
处理器可能会更幸运,它只计算接收到的流文件的计数并休眠,直到达到配置的阈值。是的,这正是它所做的。如果我添加事件驱动的调度策略,我想只要第一个流文件出现,处理器将运行,同样的事情也会发生。我的情况如下:我将一个大的csv文件分解为一行流文件,我将它们转换为sql,并最终将它们插入数据库。在这一部分之后,我将使用EMC处理器作为同步机制,以便了解我何时完成对整个CSV文件的处理。(将所有数据插入数据库中)。我不确定我是否理解您的场景--这个新的“EMC”处理器不是将多个流文件实际合并回单个流文件,而是等待所有流文件完成,然后只向后续组件发送一个(任意)流文件?通用聚合器组件有一个open for a general purpose aggregator component(开放式聚合器组件)和一个可满足您需要的组件。如果它由于大量流文件而阻塞,您应该检查此处理器如何遵守
产量持续时间
调度策略
配置选项。如果此处理器除了等待
x
flowfiles之外,实际上不执行任何逻辑,那么它可能应该具有
事件驱动的
调度策略
,因此不会不必要地运行。使用
ExecuteScript
处理器可能会更幸运,它只计算接收到的流文件的计数并休眠,直到达到配置的阈值。是的,这正是它所做的。如果我添加事件驱动的调度策略,我想只要第一个流文件出现,处理器将运行,同样的事情也会发生。我的情况如下:我将一个大的csv文件分解为一行流文件,我将它们转换为sql,并最终将它们插入数据库。在这一部分之后,我将使用EMC处理器作为同步机制,以便了解我何时完成对整个CSV文件的处理。(将所有数据插入数据库)。非常感谢!我已经淘汰了EMC,我编写了另一个处理器,它的工作效率远远低于EMC。非常感谢!我已经淘汰了EMC,我还编写了另一个doe处理器