首页 > 解决方案 > Nifi 内容与属性修改技术

问题描述

在 Nifi 中,我们可以通过两种方式设计流程:

  1. 基于内容的修改 (UpdateContent) - 在这种方法中,我们直接修改 flowfiles 的内容。在每个阶段,流文件内容都将保存在流文件存储库中。

样品流程:

ListFile -> FetchFile -> ValidateRecord (sanity) -> UpdateContent -> CSVtoAvro -> AvrotoORC - >PutHDFS
  1. 基于属性的修改 (UpdateAttribute) - 在这种方法中,我们将流文件的内容作为属性存储在内存中并直接修改它们。更新完成后,我们将属性写入流文件,然后使用 MergeContent 合并流文件。

在性能方面,我们在第一种情况下获得了更好的性能,in the second case many of the processors are slow like ExtractText and specially MergeContent. 话虽如此,我也做了并发线程和背压级别的修改,但仍然无法获得更好的性能。

List File -> FetchFile -> Extract Text -> UpdateAttribute ->AttributeToCSV -> CSVtoAvro -> AvrotoORC -> Mergecontent -> PutHDFS(粗流)

我想了解为什么属性方法的性能较差以及我是否做错了什么。请建议。

我们有 200 个列文件,所有列都被视为要修改的属性。该机器是 32 GB 机器,带有 (16GB NIFI) 和四核 Intel Core i7-4771,硬盘总大小:500.1GB。

标签: apache-nifihdfhdp

解决方案


一点点理论

  1. 基于内容的修改 - 基于内容存储库。它只是 Nifi 本地磁盘上的多个二进制附加文件,它们通过文件路径和偏移链接到流文件(在这里你可以找到更多)。
  2. 基于属性的修改:属性只是 JVM Heap 中的一个映射,由 Write Ahead Log 支持(在这里你可以找到更多)。因此,基于属性的修改适用于内存中的数据并且速度更快。

两个可能的问题

  1. 我并不认为您正在使用基于属性的修改。MergeContent仍在处理内容,因此您需要UpdateAtributeMergeContent.

  2. 或者,您也可以检查属性的数量。如果属性太多,内存映射将溢出到磁盘,您将失去使用内存的好处。但我认为第一点是问题

附言

如果您认为不是这种情况,请使用流文件的数量、提取的文本到属性的数量、机器特性、也许是基于内容的方法的详细信息来更新您的问题,以便我能够比较...

问题更新后的 UPD

您基于内容的流程:

(1) ListFile -> (2) FetchFile -> (3) ValidateRecord (sanity) -> (4) UpdateContent -> (5) CSVtoAvro -> (6) AvrotoORC -> (7) PutHDFS

在这里,在步骤 3、4、5 和 6 中,您正在执行写时复制:从 Content Repository(本地文件系统)中读取每个流文件,修改它们并附加回 ContentRepository。因此,您正在进行 4 次读写迭代。

您的基于属性的流程:

(1) List File -> (2) FetchFile -> (3) Extract Text -> (4) UpdateAttribute -> (5) AttributeToCSV -> (6) CSVtoAvro -> (7) AvrotoORC -> (8) Mergecontent -> (9) PutHDFS

在这里,在第 6 步和第 7 步,您仍在进行 2 次读写迭代。此外,MergeContent 是另一个瓶颈,第一个选项不存在。MergeContent 正在从磁盘读取所有输入数据,合并它们(我认为是在内存中)并将结果复制回磁盘。因此,第 6、7 和 8 步已经足够慢,给您带来与基于内容的流程一样糟糕的性能。此外,第 3 步是将内容复制到内存(另一个从磁盘读取),您可能会遇到磁盘交换

因此,对于基于属性的流程,看起来您拥有几乎相同的磁盘读/写事务量/数量。同时,您也可能会争用 RAM(JVM 堆),因为您的所有内容都多次存储在内存中:

  • 属性的每个版本(已清理、更新等)都存储在内存中
  • MergeContent 可能会在内存中存储另一部分数据因此,由于磁盘交换,您可能会有更多的磁盘迭代(但这应该检查,这取决于同时处理的文件量)。

另一点是答案取决于您如何进行转换。

另外,您在第一种方法中使用什么处理器?你知道QueryRecord处理器吗?


推荐阅读