Bubble执行模式
本文介绍 Auto-Scaling 资源组中的 Bubble 执行模式。Bubble 执行模式支持根据查询实际分配到的资源配额进行自适应调度,兼顾查询通过性和执行性能。
本文所有配置项均可通过 Config和Hint配置参数。
背景信息
AnalyticDB for MySQL中查询的负载比较多样化,既有低延迟实时分析查询,也有大数据量的 ETL(Extract-Transform-Load)清洗类查询。实时分析查询对查询延迟要求较高,希望能更快完成;清洗类查询对延迟要求不高,通常希望用更低的执行成本完成,并且尽可能不要影响实时分析类查询的执行。
AnalyticDB for MySQL将对查询延迟要求高的实时查询称为Interactive查询;对延迟不高、数据量很大的查询称为Batch查询。针对两种不同的查询类型,AnalyticDB for MySQL 支持两种执行模式:
MPP(针对 Interactive 查询):查询的所有 Stage 同时调度执行,中间结果以流水线方式在上下游 Stage 之间流转。
BSP(针对 Batch 查询):查询的 Stage 根据依赖关系逐个调度执行,Stage 产生的中间结果会持久化,存在一定的额外开销。
对比项 | MPP(Interactive 查询) | BSP(Batch 查询) |
调度方式 | 所有 Stage 同时调度 | Stage-by-Stage 调度,每次只执行 1 个 Stage |
数据传输方式 | 流式传输 | 持久化,存在额外开销 |
资源需求 | 高 | 低 |
适用场景 | 对 RT 敏感、执行时间较短(秒级或毫秒级)、数据量不大。例如:点查、实时分析。 | 对 RT 不敏感、执行时间长(分钟级或小时级)、查询稳定性要求高、数据量非常大的查询。例如:ETL。 |
在 Auto-Scaling 资源组中,系统会根据资源组水位给查询在一定范围内分配资源配额。资源水位较高时查询使用更少的资源配额,反之使用更多的资源配额。在不同资源配额下:
MPP:低于一定资源量后,因资源不足而无法执行。资源充足时性能优于 BSP。
BSP:在各种资源配额下都能稳定调度执行,但由于存在额外的中间数据持久化开销,资源充足时性能不如 MPP。
Bubble执行模式
优势
Bubble 执行模式支持根据实际资源配额和查询的资源评估结果,自适应选择同时调度的 Stage。相比于 MPP 和 BSP 执行模式,Bubble 执行模式有以下优势:
无需您根据查询复杂度和资源配额手动选择查询模式,系统自动完成自适应调度。在资源紧缺时保证查询通过性,在资源充足时达到与 MPP 相同的性能。
在资源临界区域,Bubble 执行模式可以让部分 Stage 同时调度,Stage 间数据流式传输,减少额外开销,性能比 BSP 更优。同时资源配额对性能的影响更加平滑,避免在 MPP 资源阈值附近出现性能突变。
工作原理
Bubble 切分器根据查询的资源评估结果,结合查询实际分配到的资源配额,将完整的执行计划切分为若干个片段(每个片段称为一个 Bubble),确保每个 Bubble 的峰值内存在资源配额限制范围内。Bubble 之间的中间结果会持久化,因此 Bubble 之间不需要同时调度,可以独立执行。
Bubble 执行模式依赖资源评估模块,因此仅支持在 Auto-Scaling 资源组中使用。关于资源评估和查询资源配额的详细逻辑,请参见查询资源评估与配额调优。
Bubble 调度器根据 Bubble 之间的依赖关系逐个调度执行:Bubble 内的所有 Stage 同时调度执行(类似 MPP);Bubble 之间根据依赖关系逐个执行(类似 BSP)。当资源充足、Bubble 切分较少时更接近 MPP 调度;当资源不足、Bubble 切分较多时更接近 BSP 调度。
Bubble 执行模式在 Auto-Scaling 资源组中默认开启,对所有 Interactive 模式的查询生效。如果查询的资源配额充足,Bubble 切分器不会做 Bubble 切分,此时调度方式等价于 MPP。
常见问题
查询 OOM
开启 Bubble 执行模式后,您仍然可能遇到查询 OOM 问题。可能原因包括:
统计信息不准确,或查询的执行计划过于复杂,导致峰值内存评估出现较大偏差。
存在数据倾斜,内存负载集中在单个节点上。虽然整体内存配额足够,但单个节点内存超限。
解决方法:
查询性能不稳定
以下因素可能导致查询性能不稳定:
Auto-Scaling 资源组水位不同,实际分配到的资源配额发生变化。
统计信息变动导致 Bubble 切分方式出现变化。
如果您对查询性能稳定性要求较高,建议:
配置固定的查询资源配额,详情请参见查询资源评估与配额调优。
关闭 Bubble 执行模式以确保使用 MPP 调度:
bubble_query_scheduler_enabled=false。