在NiFi数据流中,如果我想根据特定字段的值将单个流文件分成两组,就性能而言,以下列方式使用QueryRecord或PartitionRecord是否更快?
QueryRecord:
SELECT * FROM FLOWFILE WHERE WEIGHT < 1000;
PartitionRecord
UpdateRecord
中,使用值为greater_or_less
的新“字符串”字段/weight
UpdateRecord
中以文字值模式将greater_or_less
更新为${field.value:toNumber():lt(1000)}
PartitionRecord
分区greater_or_less
上的流文件在PartitionRecord方法中,我将有两个模式,一个模式是原始数据格式,另一个模式除了原始数据格式外还有greater_or_less
字段。我们将在原始模式中开始步骤1,在新模式中从步骤1输出,然后在原始模式中输出步骤3。步骤3的输出应为两个流文件,一个等效于QueryRecord方法的输出。
总而言之,尽管QueryRecord
的实现比较简单,但是我对NiFi的后端机制以及这些处理器的开销相比没有任何了解,因此我不确定方法是最佳的。我的直觉告诉我,QueryRecord
很昂贵,但是我不确定它与PartitionRecord
方法的类型切换和记录读写过程相比如何。
答案 0 :(得分:1)
我不知道哪一个更快,但是两者都可以在Apache Calcite的后台运行,这非常快。
您是否考虑过使用GenerateFlowfile生成测试数据并进行尝试?
我希望PartitionRecord最好,但是请使用filter with a predicate而不是使用UpdateRecord在架构中生成新字段。
答案 1 :(得分:0)
两者都使用Record Reader和Writer进行记录级处理。因此,转换记录摘要处理器的实现没有什么区别。
与之不同的是,PartitionRecord访问类型是本机的,并且记录级别的处理速度更快,而QueryRecord具有运行SQL的额外开销,为此它必须根据Calcite规范构造其记录和元数据,这是一个开销。
大约5分钟的统计信息,我能够在相同的线程数下,在QueryRecord上以1:18:00的任务时间处理47GB的数据,而在PartitionRecord上以0:47:00的任务时间进行处理。