QueryRecord与PartitionRecord以获得更好的性能?

时间:2018-08-23 02:36:43

标签: java performance etl apache-nifi

在NiFi数据流中,如果我想根据特定字段的值将单个流文件分成两组,就性能而言,以下列方式使用QueryRecord或PartitionRecord是否更快?

QueryRecord:

SELECT * FROM FLOWFILE WHERE WEIGHT < 1000;

PartitionRecord

  1. 在{em> RecordPath 模式下的UpdateRecord中,使用值为greater_or_less的新“字符串”字段/weight
  2. UpdateRecord中以文字值模式将greater_or_less更新为${field.value:toNumber():lt(1000)}
  3. PartitionRecord分区greater_or_less上的流文件

在PartitionRecord方法中,我将有两个模式,一个模式是原始数据格式,另一个模式除了原始数据格式外还有greater_or_less字段。我们将在原始模式中开始步骤1,在新模式中从步骤1输出,然后在原始模式中输出步骤3。步骤3的输出应为两个流文件,一个等效于QueryRecord方法的输出。

总而言之,尽管QueryRecord的实现比较简单,但是我对NiFi的后端机制以及这些处理器的开销相比没有任何了解,因此我不确定方法是最佳的。我的直觉告诉我,QueryRecord很昂贵,但是我不确定它与PartitionRecord方法的类型切换和记录读写过程相比如何。

2 个答案:

答案 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的任务时间进行处理。