apache-nifi - Nifi 内容与属性修改技术
问题描述
在 Nifi 中,我们可以通过两种方式设计流程:
- 基于内容的修改 (UpdateContent) - 在这种方法中,我们直接修改 flowfiles 的内容。在每个阶段,流文件内容都将保存在流文件存储库中。
样品流程:
ListFile -> FetchFile -> ValidateRecord (sanity) -> UpdateContent -> CSVtoAvro -> AvrotoORC - >PutHDFS
- 基于属性的修改 (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。
解决方案
一点点理论
- 基于内容的修改 - 基于内容存储库。它只是 Nifi 本地磁盘上的多个二进制附加文件,它们通过文件路径和偏移链接到流文件(在这里你可以找到更多)。
- 基于属性的修改:属性只是 JVM Heap 中的一个映射,由 Write Ahead Log 支持(在这里你可以找到更多)。因此,基于属性的修改适用于内存中的数据并且速度更快。
两个可能的问题
我并不认为您正在使用基于属性的修改。
MergeContent
仍在处理内容,因此您需要UpdateAtribute
在MergeContent
.或者,您也可以检查属性的数量。如果属性太多,内存映射将溢出到磁盘,您将失去使用内存的好处。但我认为第一点是问题
附言
如果您认为不是这种情况,请使用流文件的数量、提取的文本到属性的数量、机器特性、也许是基于内容的方法的详细信息来更新您的问题,以便我能够比较...
问题更新后的 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处理器吗?
推荐阅读
- cmake - 在任何平台上从命令行选择 CMake 的发布模式
- c# - 在 javascript 中反序列化对象数组时出错
- java - json 文件的 MyClass.class.getResourceAsStream 返回 zip 文件
- datetime - ChartJs x 轴标签为 dateTime 格式问题:DD-MMM-YYYY,但显示为 MMM-YYYY-DD
- azure - 如何限制/设置使用 Azure WebJobs 执行的 QueueTrigger 的并行度
- amazon-web-services - 如何将 CloudFront 日志流式传输到 CloudWatch
- emacs - Emacs:用于 TypeScript 规范文件发现的 projectile-toggle-between-implementation-and-test
- r - 如何在 R 中为箱线图分配颜色?只能使用基础 R
- go - 当有接口及其在不同包中的实现时如何管理循环依赖
- node.js - 端点级别的 Node.js 集群负载平衡