【跨国数仓迁移最佳实践3】资源消耗减少50%!解析跨国数仓迁移至MaxCompute背后的性能优化技术

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 本系列文章将围绕东南亚头部科技集团的真实迁移历程展开,逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第3篇,解析跨国数仓迁移背后的性能优化技术。注:客户背景为东南亚头部科技集团,文中用 GoTerra 表示。

一.背景


作为东南亚数字经济的核心参与者,GoTerra 的数据架构需支撑亿级用户规模的交易、高并发风控及跨区域物流调度。其原有 BigQuery 数仓虽具备强大的分析能力,但在业务规模突破临界点后,成本问题日益凸显。迁移至 MaxCompute 的核心目标,是通过底层架构重塑与性能优化技术体系,实现“降本”与“增效”的双重突破。在攻克 SQL 语法转换、存储格式等技术难题后,迁移进入深水区——性能优化成为项目推进的关键瓶颈,并且面临三大核心挑战:

  • 业务脚本复杂性高:涉及 1万+ 生产级 SQL 脚本,覆盖支付、物流、风控等核心业务线,脚本模式丰富、性能目标及成本诉求各异,优化难度大。
  • 增量功能叠加挑战大:迁移过程中同步推出的600+新功能append2.0unnest)导致优化复杂度指数级上升。
  • 极限交付时间窗口:需在不足4个月的时间内,保障所有业务平滑迁移至 MaxCompute,同时全面满足高标准 SLA,容错空间极小。

二.性能优化方法论:从“盲人摸象”到“精准狙击”


针对上述挑战,团队摒弃传统“粗放式”优化策略,转而建立“数据驱动、分层治理”的优化框架,其核心逻辑是通过智能分类,将有限资源投入关键瓶颈点。根据二八原则,80% 的问题/资源消耗来自 20% 的高频或低效查询,为了精准定位问题,我们通过一个自动化的分类工具快速识别:

  • 高频查询:优化收益最大。
  • 低效查询:存在潜在优化空间(如全表扫描、非预期 CROSS JOIN)。
  • 关键业务查询:需优先保障 SLA。


同时在这个工具基础上:

  • 建立性能基线:分类后统计各类型查询的耗时、资源消耗趋势。
  • 评估优化效果:对比优化前后的同类型查询指标变化。


以下是性能优化初期查询分类的一个示例图,从图中我们很轻易的可以看到,分区裁剪/复杂类型/append2/unnest 等是主要问题,应该着重解决。


640 (15).png


三.关键优化


1.Auto Partition 优化


①.痛点


MC 通过 Auto Partition 表来实现和 BQ time-unit column partitioning 类似的功能。相较于传统静态分区表,Auto Partition 表通过 trunc_time 函数动态生成分区列,如下图所示:


640 (16).png


Auto Partition 功能有效提升了分区管理的灵活性,但是分区列与查询条件无法直接映射导致无法直接复用静态分区表的分区裁剪流程,从而使得分区裁剪失效,引发两大核心问题:

1. 读表性能劣化:查询需全量扫描所有分区,时延高。

2. 资源浪费严重:冗余数据扫描使计算资源消耗高。


②.方案


为了支持 Auto Partition 表的分区裁剪功能,我们设计了基于表达式推导的动态分区裁剪方案,在保证查询语义正确性的前提下最大化减少数据扫描量。假设有下 Auto Partition 表及其查询

create table auto_partition_table
(
  key string, 
  value bigint, 
  ts timestamp
) 
partitioned by trunc_time(ts, 'day') as pt
;

SELECT * FROM auto_partition_table 
WHERE ts > timestamp'2024-09-25 01:12:15';


从上可以看到基于 ts 列的过滤条件做分区裁剪的本质是进行表达式映射转换,即将 ts 列相关的表达式转换成 pt 列相关的表达式。需要注意的是转换前后的表达式不要求完全等价,但是要求过滤结果存在“包含”的关系,具体又可以分为以下3种场景。


基础裁剪场景


对于 ts 列的过滤条件中不包括函数的场景,可以直接做表达式的推导转换,但是转换前后的表达式过滤范围不等价,因而原始表达式需要保留,推导过程如下所示:


640 (17).png

函数非等价转换场景


对于查询条件包含时区转换、日期格式函数等操作时,对于 ts 列的过滤条件无法直接做表达式的映射转换,因此我们引入了内置函数理解的能力,将表达式中的函数 fold 掉。假设有如下查询:

select * from auto_partition_table 
where TODATE(FROM_UTC_TIMESTAMP(ts, 'Asia/Jakarta')) = date '2024-09-14'


在分区裁剪过程中,过滤条件会做如下推导:


640 (18).png


需要注意的是,原始过滤条件的结果是分区裁剪结果的子集,所以推导的过程只能应用在分区裁剪内部,原始的过滤条件会保留。


函数等价转换场景


如果查询条件中的函数与分区键定义函数语义完全等价,如 datetrunc(ts, 'day')与trunc_time(ts, 'day'),那么对于 ts 列的过滤条件可以做等价转换,这个过程也依托内置函数理解框架来实现。

select * from auto_partition_table 
where datetrunc(ts, 'day') >= timestamp '2024-09-14 10:01:01';


上述查询中 datetrunc(ts, 'day') 语义上和 trunc_time(ts, 'day')相同,因而可以做如下推导转换:


640 (19).png


这个过程中的表达式转换是等价的,因此,分区裁剪完成后,原始的过滤条件不需要再保留。


③.价值


通过基于表达式推导的动态分区裁剪方案,MaxCompute 在保持分区管理灵活性的同时,实现了与静态分区表同级的 高性能、低成本的数据处理能力。

2.复杂类型之 unnest 优化


①.痛点


在 Google BigQuery 中,UNNEST 是处理数组(ARRAY) 类型数据的核心操作,用于将嵌套的数组结构展开为多行平铺数据,如下所示:


640 (20).png


GoTerra 的查询大量使用 UNNEST,这些查询迁移至 MaxCompute 后,需通过 LATERAL VIEW + EXPLODECROSS JOIN 模拟此功能,导致以下性能问题:

  • 执行计划冗余:单次 UNNEST 被拆解为 多次 TableScan 和 Join,资源消耗激增。
  • 数据膨胀风险:笛卡尔积引发中间结果爆炸。
  • 功能局限:无法高效处理 多层嵌套 ARRAY。


以下是一个简化的 case:

create table foo (
creation_date date, 
params array<struct<user_id:string, tags:string>>
) ;

select creation_date, 
(select count(*) from
 unnest(param) where tags='Mac' ) as m_cnt,
(select count(*) from
 unnest(param) where tags='Linux' ) as l_cnt
from foo;


其执行计划如下:


640 (21).png


从上图可以看到,执行计划有以下问题:

1. 对同一个 table 有3次 Scan。

2. 对同一个 column 执行了2次同样的 explode 操作。

3. 执行了多次 join。


②.方案


针对上述问题,我们重新设计了 unnest 的支持框架,采用了通用的框架,即支持执行 sub plan 的 apply 算子,以便具备通用的 subquery 执行能力和更强的扩展性。在新的框架下,unnest 相关的查询计划如下所示:


640 (22).png


整个优化过程可以概述为下面几个步骤:

  • 引入了 Internal plan 的概念,Internal plan 也是一颗算子树,代表外层中对每一行数据的内部计算逻辑,编译器会按照上述要求生成初始的 plan。
  • 优化器需要做进一步优化,关键的步骤包含:
  • Internal plan 不能影响外部 plan 的优化,包括下推、列裁剪等。
  • 外部 plan 优化完成后,需要对 Internal plan 做优化。
  • 优化过程中需要对相邻 TableFunctionScan 做合并,之后对合并后的 Internal plan 做 SubtreeMerge。
  • 执行器需要根据外层和内层执行计划执行。


③.价值


通过对 UNNEST 执行框架的重构和升级,MaxCompute 的 Unnest 能力在性能、稳定性上方面都有突破:1)性能提升1-10倍;2)避免了大型嵌套 UNNEST 场景下导致的 OOM 错误,为复杂数据分析场景打下了坚实的基础。


3.超大型查询优化


①.痛点


GoTerra 的查询中存在大量超大型查询,这些超大型查询出来的执行计划体量远大于一般大型查询计划, 其特征为算子多, 子查询深度嵌套, 单行类型信息中 单列的 STRUCT 内部列达数千个。


640 (23).png


超大型查询计划会使得优化器在处理计划过程中出现大量内存使用, 遍历图缓慢等问题。针对超大型查询计划, 我们开发了以下技术解决。


②.方案


图优化


每一个查询计划都是由关系算子组成的有向无环图, 图的遍历方向为从输出到输入。
而优化器主要的工作是对图中的算子模式进行匹配, 并且使用新的算子结构替换图中旧的算子结构。


640 (24).png


Digest 全局复用


Digest (完整摘要) 表达了关系算子的任意部分的完整信息, 是优化器识别关系算子的关键。 每次变换生成新的关系算子, 都需要构造关系算子整体 Digest, 包含类型信息 Digest/标量函数 Digest 等。


我们支持了对这三类信息的缓存以及局部复用。 由于实际计划中存在大量相似信息结构, 在实际优化过程中将相关对象哈希和相等比较计算复杂度, 以及所需内存空间降低了几个数量级。


以类型信息为例:


640 (25).png


③.价值


通过超大规模查询优化技术,MaxCompute 突破优化器瓶颈,实现 深度嵌套、复杂类型、百万级算子 执行计划的高效处理。在典型大型查询中, 优化耗时从15分钟+降至1分钟, 峰值内存从 5GB+ 降低至 1GB。


4.Intelligent Tuning


①.痛点


在大数据计算场景下,因为统计信息的缺失、大量存在的 UDF 优化黑盒、作业复杂度高(如 GoTerra 的 SQL 经常有几千行)等等因素,使得优化器很难做准确的基数估计,产生最优的执行计划,以及难以事先给定一个理想的各 stage 资源分配计划。


这就导致一方面系统 miss 了大量的优化机会,另一方面用户对关心的作业往往需要进行手动调优,如调整各 stage 并发度、添加调优 flag 等,费时费力门槛高,并且当数据和作业发生变化时,还需要进行相应的调整。


Intelligent Tuning 就是要解决这一系统和用户的痛点,对于计算逻辑基本相似的 recurring job,能够充分利用历史执行信息,来对未来执行起到指导作用,从而能够做到系统自动优化,提升作业整体性能。


②.方案


我们的主要思路是收集作业实际运行的丰富的统计信息,经过实时的 feedback 或者离线的更加复杂的 training 和分析后,使得优化器能够学习到作业的历史执行状态,更加聪明地“理解数据、理解作业”,一方面将历史统计信息注入到 CBO 框架中产生全局最优的执行计划,另一方面根据每个 stage 的计算量、运行速度等,智能地调整并发度,避免 worker 资源的浪费,以及自动对并发度偏低的 stage 进行加速。


640.jpg

架构图


下图列举了 Intelligent Tuning 整体的优化能力,包括执行计划优化、资源分配优化、执行模式选择优化、以及 runtime 算子执行优化。Intelligent Tuning 具备框架性的优化扩展能力,一方面能够自动利用 CBO 框架去让一些优化规则生效,另一方面也能不断拓展作业运行方方面面的优化。


640 (26).png


③.价值


Intelligent Tuning 是性能优化的“第二增长曲线”,极大地避免了人工作业调优,同时使得系统自动优化能力大大增强。在 GoTerra 项目中,应用 Intelligent Tuning 的资源分配优化后,典型项目能够节省87%资源,通过更加智能的执行模式选择,避免 online job 回退 offline job 带来的损耗,典型作业提速45%。Intelligent Tuning 的优化能力还在扩展中,将不断提升引擎的性能和易用性。


四.总结及未来展望


对 MaxCompute 而言,GoTerra 的迁移不仅是亚太区头部客户的标杆实践,更是一次超大规模负载下的性能极限验证。在4个月的性能攻坚中,我们通过内核级重构和升级,实现了资源效率与计算性能的范式级突破:

1. 资源效率突破

  • 金融 ETL 场景:CU 消耗仅为 BigQuery 的 50%。
  • BI 分析场景:E2E 端到端查询耗时相比初始减少 83%,完全满足业务需求。

2. 技术突破

  • 新增包括 Auto Partition/Unnest/Append2.0 等600+功能,语法/性能方面无缝对接 BigQuery。
  • 超大规模计划优化:支持百万级算子的执行计划解析,典型查询优化耗时从15分钟+降至1分钟。
  • 复杂类型深度优化:支持/完善复杂类型列裁剪/谓词下推/零拷贝等优化,典型 case 性能提升20倍。


回顾本次 GoTerra 迁移至 MaxCompute 的性能优化过程,我们通过分阶段、分场景的持续优化,有效提升了 BI、ETL 等场景下的查询性能,圆满完成了迁移目标。面向未来,我们将结合 GoTerra 的业务需求和业界技术发展趋势,继续围绕“更快、更省、更稳”的目标,重点聚焦以下几个方向:

  • 更快:持续深挖性能潜力,极致性能优化
  • 增量更新:持续推进数据的增量更新机制,显著降低计算资源消耗,加快数据可用速度,提升用户操作体验。
  • 地理类型原生支持:加强对地理空间数据类型的原生支持,结合空间索引,大幅提升时空数据复杂查询的执行效率,增强地理类业务的核心竞争力。
  • 异构计算融合:探索异构计算(如GPU等)与 MaxCompute的深度融合场景,进一步加快关键分析任务处理速度。
  • 更省:精细化资源管理与成本优化
  • 智能弹性伸缩:开发并完善基于实时负载的弹性资源调度机制,在业务波峰波谷场景下,实现资源的自动扩容和缩减,显著提升资源利用率,降低用户成本。
  • 按需计费与成本监控:引入更为精细化的多维度资源计量体系和主动式成本告警,帮助用户按需选型,合理分配预算,避免资源浪费。
  • 更稳:面向未来的高可用性和可观测性
  • 容灾与高可用:构建多区域、多活的数据冗余与容错机制,提升系统面对硬件故障、大规模流量和异常情况时的业务连续性和可靠性。
  • 完善可观测性:加强全链路的性能监控、SQL 诊断和自动健康检查能力,实现故障早发现、早定位、快速自愈,保障核心业务稳定运行。

五.结语

GoTerra 跨国数仓迁移不仅为行业树立了数据平台升级与性能优化的技术标杆,也为 MaxCompute 实现世界一流性能奠定了坚实基础。在整个项目过程中,团队积累了针对大规模复杂场景的性能优化方法论、自动化工具链及通用实战经验,为后续跨地域、超大规模数据仓库系统的迁移提供了成熟范本和可复用经验。展望未来,MaxCompute 将持续深化性能驱动的技术创新。一方面,聚焦 AI 驱动的智能调优和自动化运维,不断提升系统的自适应资源调度、性能监控和异常自愈能力,进一步提高开发和运维效率;另一方面,将积极推动数据湖与数仓融合、原生地理类型/非结构化类型和增量计算等新方向,不断拓展性能优化的边界。通过持续的技术演进,MaxCompute 将为大规模数据场景下的企业提供更强的性能保障和更高的运维效率,加速业务价值释放,助力客户应对未来更为复杂的大数据挑战。

/ END /

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
2月前
|
SQL 缓存 分布式计算
【跨国数仓迁移最佳实践5】MaxCompute近线查询解决方案助力物流电商等实时场景实现高效查询
本系列文章将围绕东南亚头部科技集团的真实迁移历程展开,逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第5篇,解析跨国数仓迁移背后的性能优化技术。 注:客户背景为东南亚头部科技集团,文中用 GoTerra 表示。
130 8
|
6月前
|
存储 缓存 分布式计算
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解读。 作者:杨关锁,北京镜舟科技研发工程师
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
|
4月前
|
存储 SQL 人工智能
【跨国数仓迁移最佳实践1】Append Delta Table 统一存储格式创新
本系列文章将围绕东南亚头部科技集团的真实迁移历程展开,逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第一篇,跨国数仓迁移背后 MaxCompute 的统一存储格式创新。 注:客户背景为东南亚头部科技集团,文中用 GoTerra 表示。
109 0
|
10月前
|
SQL 监控 关系型数据库
用友畅捷通在Flink上构建实时数仓、挑战与最佳实践
本文整理自用友畅捷通数据架构师王龙强在FFA2024上的分享,介绍了公司在Flink上构建实时数仓的经验。内容涵盖业务背景、数仓建设、当前挑战、最佳实践和未来展望。随着数据量增长,公司面临数据库性能瓶颈及实时数据处理需求,通过引入Flink技术逐步解决了数据同步、链路稳定性和表结构差异等问题,并计划在未来进一步优化链路稳定性、探索湖仓一体架构以及结合AI技术推进数据资源高效利用。
699 25
用友畅捷通在Flink上构建实时数仓、挑战与最佳实践
|
8月前
|
JSON 分布式计算 DataX
【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute
本文介绍使用崖山适配的DataX工具进行数据库迁移的方法,包括单表迁移和批量表迁移。单表迁移需配置json文件并执行同步命令;批量迁移则通过脚本自动化生成json配置文件并完成数据迁移,最后提供数据比对功能验证迁移结果。具体步骤涵盖连接信息配置、表清单获取、json文件生成、数据迁移执行及日志记录,确保数据一致性。相关工具和脚本简化了复杂迁移过程,提升效率。
|
11月前
|
SQL 存储 人工智能
化整为零:湖仓数据平台一站式迁移
本文介绍了湖仓平台迁移的概况、痛点及解决方案。首先概述了数据湖和数据仓库迁移的现状与背景,强调其重要性及挑战。接着分析了迁移过程中的主要痛点,如数据量大、业务变更频繁等。最后提出了一种化整为零的新范式,通过精细化设计和自动化工具提升迁移效率,并展示了一站式湖仓迁移中心的关键阶段和产品大图,旨在加速迁移过程并减少人工成本。
|
分布式计算 DataWorks MaxCompute
DataWorks产品使用合集之需要将mysql 表(有longtext类型字段) 迁移到odps,但odps好像没有对应的类型支持,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
146 0
|
算法 大数据 数据库
云计算与大数据平台的数据库迁移与同步
本文详细介绍了云计算与大数据平台的数据库迁移与同步的核心概念、算法原理、具体操作步骤、数学模型公式、代码实例及未来发展趋势与挑战。涵盖全量与增量迁移、一致性与异步复制等内容,旨在帮助读者全面了解并应对相关技术挑战。
362 3

相关产品

  • 云原生大数据计算服务 MaxCompute