Druid 中帧大小配置及 RowTooLarge 错误解决方案

Druid 中帧大小配置及 RowTooLarge 错误解决方案

背景

在 Apache Druid 中,数据处理通常会将大规模数据划分为多个 “frame”(帧)进行处理。在这个过程中,frame size(帧大小)是一个关键参数,它决定了每个 frame 最多可以处理多少数据。frame size 过大或过小都可能影响性能,甚至导致处理失败。此错误日志表明,在处理某条数据时,遇到了一行数据其大小超过了指定的 frame size,从而导致任务失败。

错误信息:

1
RowTooLarge: Encountered row that cannot fit in a single frame (max frame size = 1,000,000)

表明在处理数据时,Druid 遇到了一行数据,其大小超过了 1,000,000 字节(即 STANDARD_FRAME_SIZE),无法适配当前的 frame size 限制。

调试

  1. Frame Size 配置:从代码片段可以看到,Druid 默认的 frame size 是 1,000,000 字节。STANDARD_FRAME_SIZE 的值是静态定义的:

    1
    private static final int STANDARD_FRAME_SIZE = 1_000_000;

    该值在 Druid 任务执行过程中被用作内存分配的标准 frame size:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      final InputChannels inputChannels =
    new InputChannelsImpl(
    workOrder.getQueryDefinition(),
    InputSlices.allReadablePartitions(workOrder.getInputs()),
    inputChannelFactory,
    () -> ArenaMemoryAllocator.createOnHeap(frameContext.memoryParameters().getStandardFrameSize()),
    exec,
    cancellationId
    );

    public int getStandardFrameSize()
    {
    return STANDARD_FRAME_SIZE;
    }
  2. 任务失败原因:任务失败是因为某一行数据的大小超过了 1,000,000 字节的限制,无法装入单个 frame 中。该错误信息表明,在执行过程中,某一行数据对于设置的最大 frame size 而言过大,从而导致任务失败。

  3. 修改 frame size:如果需要处理更大的数据行,可以考虑增大 STANDARD_FRAME_SIZE 的值,以便每个 frame 能处理更大的数据行。例如,可以将其修改为 2,000,000 或更高:

    1
    private static final int STANDARD_FRAME_SIZE = 2_000_000;
  4. 内存优化:增大 frame size 可能会增加内存消耗,因此在内存使用和数据处理性能之间需要进行权衡。如果内存不足,增大 frame size 可能会导致内存溢出等问题。调整该值时,需要综合考虑系统整体的内存和负载情况。

结论

任务失败的原因是某一行数据超过了 Druid 配置的最大 frame size(1,000,000 字节)。为解决此问题,可以考虑以下几种方案:

  1. 增大 frame size:将 STANDARD_FRAME_SIZE 调整为更大的值,例如 2,000,000 或更高,以便能够处理更大的数据行。
  2. 优化数据行大小:如果条件允许,调整数据的生成方式,以减小单行数据的大小。
  3. 内存管理:增大 frame size 可能会增加内存消耗,需要确保系统有足够的可用内存。

调整 frame size 时,建议结合实际内存使用情况进行测试,避免因内存不足引发其他问题。


Druid 中帧大小配置及 RowTooLarge 错误解决方案
https://garychow-lgtm.github.io/zh-CN/2025/03/19/Frame-Size-Configuration-and-RowTooLarge-Error-Resolution-in-Druid/
作者
Gary Chow (Yimin Cao)
发布于
2025年3月19日
许可协议