Druid 中帧大小配置及 RowTooLarge 错误解决方案
Druid 中帧大小配置及 RowTooLarge 错误解决方案
背景
在 Apache Druid 中,数据处理通常会将大规模数据划分为多个 “frame”(帧)进行处理。在这个过程中,frame size(帧大小)是一个关键参数,它决定了每个 frame 最多可以处理多少数据。frame size 过大或过小都可能影响性能,甚至导致处理失败。此错误日志表明,在处理某条数据时,遇到了一行数据其大小超过了指定的 frame size,从而导致任务失败。
错误信息:
1 | |
表明在处理数据时,Druid 遇到了一行数据,其大小超过了 1,000,000 字节(即 STANDARD_FRAME_SIZE),无法适配当前的 frame size 限制。
调试
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
14final 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;
}任务失败原因:任务失败是因为某一行数据的大小超过了
1,000,000字节的限制,无法装入单个 frame 中。该错误信息表明,在执行过程中,某一行数据对于设置的最大 frame size 而言过大,从而导致任务失败。修改 frame size:如果需要处理更大的数据行,可以考虑增大
STANDARD_FRAME_SIZE的值,以便每个 frame 能处理更大的数据行。例如,可以将其修改为2,000,000或更高:1
private static final int STANDARD_FRAME_SIZE = 2_000_000;内存优化:增大 frame size 可能会增加内存消耗,因此在内存使用和数据处理性能之间需要进行权衡。如果内存不足,增大 frame size 可能会导致内存溢出等问题。调整该值时,需要综合考虑系统整体的内存和负载情况。
结论
任务失败的原因是某一行数据超过了 Druid 配置的最大 frame size(1,000,000 字节)。为解决此问题,可以考虑以下几种方案:
- 增大 frame size:将
STANDARD_FRAME_SIZE调整为更大的值,例如2,000,000或更高,以便能够处理更大的数据行。 - 优化数据行大小:如果条件允许,调整数据的生成方式,以减小单行数据的大小。
- 内存管理:增大 frame size 可能会增加内存消耗,需要确保系统有足够的可用内存。
调整 frame size 时,建议结合实际内存使用情况进行测试,避免因内存不足引发其他问题。