【问题标题】:QueryRecord vs. PartitionRecord for better performance?QueryRecord 与 PartitionRecord 以获得更好的性能?
【发布时间】:2018-08-23 02:36:43
【问题描述】:

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

查询记录:

SELECT * FROM FLOWFILE WHERE WEIGHT < 1000;

分区记录

  1. UpdateRecordRecordPath 模式下使用/weight 的值填充一个新的“字符串”字段greater_or_less
  2. UpdateRecord字面值 模式下将greater_or_less 更新为${field.value:toNumber():lt(1000)}
  3. PartitionRecord 中对greater_or_less 上的流文件进行分区

在 PartitionRecord 方法中,我将有两种模式,一种是原始数据格式,另一种是除了原始数据格式之外还有greater_or_less 字段。我们将从原始模式中的第 1 步开始,在新模式中从第 1 步输出,然后在原始模式中输出第 3 步。第三步的输出应该是两个flowfile,一个相当于QueryRecord方法的输出。

总之,虽然QueryRecord 实现起来稍微简单一些,但我对 NiFi 的后端机制以及这些处理器的开销如何比较一无所知,所以我不确定哪种方法是最佳。我的直觉告诉我QueryRecord 很昂贵,但我不确定它与PartitionRecord 方法的类型切换和记录读写相比如何。

【问题讨论】:

    标签: java performance etl apache-nifi


    【解决方案1】:

    我不知道哪个更快,但两者都在 Apache Calcite 上运行,速度非常快。
    您是否考虑过使用 GenerateFlowfile 生成测试数据并进行尝试?

    我希望 PartitionRecord 会是最好的,但使用 filter with a predicate 而不是使用 UpdateRecord 在架构中生成新字段。

    【讨论】:

      【解决方案2】:

      两者都使用记录读取器和写入器进行记录级处理。所以在两者的实现中转换记录抽象处理器没有区别。

      不同之处在于 PartitionRecord 访问类型是本机的并且记录级处理速度更快,另一方面 QueryRecord 有额外的运行 SQL 开销,它必须根据 Calcite 规范来构造其记录和元数据,这是一种开销。

      大约 5 分钟的统计数据我能够处理 47GB 的数据,任务时间为 QueryRecord 上的 1:18:00,而 PartitionRecord 上的任务时间为 0:47:00,线程数相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-13
        • 1970-01-01
        • 2021-05-10
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多