【问题标题】:MergeRecord processor合并记录处理器
【发布时间】:2020-06-17 12:09:31
【问题描述】:

我很难理解 MergeRecord 处理器的工作原理。

我有一个流在 1 小时内生成大约 70 000 个流文件。我需要将所有这些流文件合并到一个唯一的流文件中。 流文件类似于 CSV,因此很简单。一次搞定有什么不容易的。

目前我有 2 个 MergeRecord 处理器一个接一个。

第一个配置如下:

  • 最小/最大记录:1000/2000
  • 最大 bin 年龄:60s
  • 仓数:2
  • 运行时间表:10 秒

最后配置如下:

  • 最小/最大记录:70/2000
  • 最大 bin 年龄:6000s
  • 仓数:2
  • 运行时间表:60 秒

每个传入队列都采用“单节点负载均衡”策略。

我的期望:

第一个MergeRecord,会根据:合并记录:

  1. 达到最低记录
  2. 如果垃圾箱已满
  3. 如果达到 bin 年龄

因此,我使用了大约 70 个合并的流文件。

第二个MergeRecord,会根据:

合并记录
  1. 达到最低记录
  2. 如果垃圾箱已满
  3. 如果达到 bin 年龄

因此将我带到 1 个流文件。

我有什么:

我尝试使用处理器参数,但似乎该处理器“仅”由运行计划参数引导。如果我在流程结束时只有一个流程文件,我必须将其设置为高值。这样处理器只有在队列满时才会被触发。 问题是队列中的 70 000 个流文件经常导致我出现 OOM 错误或 Java 堆大小错误。

关于mergeRecord处理器的配置有什么提示吗?

谢谢,

PS:我在 3 节点集群上运行。

【问题讨论】:

    标签: apache-nifi


    【解决方案1】:

    问题是队列中的 70 000 个流文件经常导致我出现 OOM 错误或 Java 堆大小错误。

    MergeRecord 将所有记录读入内存并将它们分类到输出箱中。这就是你看到这个的原因。如果您的记录不是那么大,那么增加 JVM 获得的内存量就足够了。

    PS:我在 3 节点集群上运行。

    我不确定您如何将来自 3 个不同节点的所有结果合并到一个流文件中。您可以通过让一个仅在主节点上运行的MergeRecord 并将输入连接设置为“单节点”来实现负载平衡设置。只是猜测那个。

    阻力最小的路径是让 3 个节点中的每一个都进行合并并推送到输出数据源并设置下游流程,而不必担心它是 1 个文件还是 3 个文件。

    【讨论】:

      猜你喜欢
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多