【跨國數倉遷移最佳實踐3】資源消耗減少50%!解析跨國數倉遷移至MaxCompute背后的性能優化技術

本系列文章將圍繞東南亞頭部科技集團的真實遷移歷程展開,逐步拆解 BigQuery 遷移至 MaxCompute 過程中的關鍵挑戰與技術創新。本篇為第3篇,解析跨國數倉遷移背后的性能優化技術。

注:客戶背景為東南亞頭部科技集團,文中用 GoTerra 表示。

背景

作為東南亞數字經濟的核心參與者,GoTerra的數據架構需支撐億級用戶規模的交易、高并發風控及跨區域物流調度。其原有BigQuery數倉雖具備強大的分析能力,但在業務規模突破臨界點后,成本問題日益凸顯。遷移至MaxCompute的核心目標,是通過底層架構重塑與性能優化技術體系,實現“降本”與“增效”的雙重突破。在攻克 SQL 語法轉換、存儲格式等技術難題后,遷移進入深水區——性能優化成為項目推進的關鍵瓶頸,并且面臨三大核心挑戰:

  • 業務腳本復雜性高:涉及 1萬+ 生產級 SQL 腳本,覆蓋支付、物流、風控等核心業務線,腳本模式豐富、性能目標及成本訴求各異,優化難度大。
  • 增量功能疊加挑戰大:遷移過程中同步推出的600+新功能(如append2。0unnest等)導致優化復雜度指數級上升。
  • 極限交付時間窗口:需在不足 4 個月的時間內,保障所有業務平滑遷移至 MaxCompute,同時全面滿足高標準 SLA,容錯空間極小。

性能優化方法論:從“盲人摸象”到“精準狙擊”

針對上述挑戰,團隊摒棄傳統“粗放式”優化策略,轉而建立“數據驅動、分層治理”的優化框架,其核心邏輯是通過智能分類,將有限資源投入關鍵瓶頸點。根據二八原則 ,80% 的問題/資源消耗來自 20% 的高頻或低效查詢,為了精準定位問題,我們通過一個自動化的分類工具快速識別:

  • 高頻查詢:優化收益最大
  • 低效查詢:存在潛在優化空間(如全表掃描、非預期CROSS JOIN)
  • 關鍵業務查詢:需優先保障 SLA

同時在這個工具基礎上:

  • 建立性能基線:分類后統計各類型查詢的耗時、資源消耗趨勢。
  • 評估優化效果:對比優化前后的同類型查詢指標變化。

以下是性能優化初期查詢分類的一個示例圖,從圖中我們很輕易的可以看到,分區裁剪/復雜類型/append2/unnest等是主要問題,應該著重解決。

關鍵優化

Auto Partition優化

痛點

MC通過Auto Partition表來實現和BQ time-unit column partitioning類似的功能。相較于傳統靜態分區表,Auto Partition 表通過 trunc_time 函數動態生成分區列,如下圖所示:

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列的過濾條件中不包括函數的場景,可以直接做表達式的推導轉換,但是轉換前后的表達式過濾范圍不等價,因而原始表達式需要保留,推導過程如下所示:

函數非等價轉換場景

對于查詢條件包含時區轉換、日期格式函數等操作時,對于ts列的過濾條件無法直接做表達式的映射轉換,因此我們引入了內置函數理解的能力,將表達式中的函數fold掉。假設有如下查詢:

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

在分區裁剪過程中,過濾條件會做如下推導:

需要注意的是,原始過濾條件的結果是分區裁剪結果的子集,所以推導的過程只能應用在分區裁剪內部,原始的過濾條件會保留。

函數等價轉換場景

如果查詢條件中的函數與分區鍵定義函數語義完全等價,如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')相同,因而可以做如下推導轉換:

這個過程中的表達式轉換是等價的,因此,分區裁剪完成后,原始的過濾條件不需要再保留。

價值

通過基于表達式推導的動態分區裁剪方案,MaxCompute 在保持分區管理靈活性的同時,實現了與靜態分區表同級的 高性能、低成本的數據處理能力。

復雜類型之unnest優化

痛點

在 Google BigQuery 中,UNNEST 是處理 數組(ARRAY) 類型數據的核心操作,用于將嵌套的數組結構展開為多行平鋪數據,如下所示:

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(*) fromunnest(param) where tags=‘Mac’ ) as m_cnt,
(select count(*) fromunnest(param) where tags=‘Linux’ ) as l_cnt
from foo;

其執行計劃如下:

從上圖可以看到,執行計劃有以下問題:

  1. 對同一個table有3次Scan
  2. 對同一個column執行了2次同樣的explode操作
  3. 執行了多次join
方案

針對上述問題,我們重新設計了unnest的支持框架,采用了通用的框架,即支持執行sub plan的apply算子,以便具備通用的subquery執行能力和更強的擴展性。在新的框架下,unnest相關的查詢計劃如下所示:

整個優化過程可以概述為下面幾個步驟:

  • 引入了Internal plan的概念,Internal plan也是一顆算子樹,代表外層中對每一行數據的內部計算邏輯,編譯器會按照上述要求生成初始的plan。
  • 優化器需要做進一步優化,關鍵的步驟包含:
  • Internal plan不能影響外部plan的優化,包括下推、列裁剪等。
  • 外部plan優化完成后,需要對Internal plan做優化。
  • 優化過程中需要對相鄰TableFunctionScan做合并,之后對合并后的Internal plan做SubtreeMerge
  • 執行器需要根據外層和內層執行計劃執行。
價值

通過對UNNEST執行框架的重構和升級,MaxCompute 的 Unnest 能力在性能、穩定性上方面都有突破:1)性能提升1-10倍;2)避免了大型嵌套UNNEST場景下導致的OOM錯誤,為復雜數據分析場景打下了堅實的基礎

超大型查詢優化

痛點

GoTerra的查詢中存在大量超大型查詢,這些超大型查詢出來的執行計劃體量遠大于一般大型查詢計劃, 其特征為算子多, 子查詢深度嵌套, 單行類型信息中 單列的 STRUCT 內部列達數千個。

超大型查詢計劃會使得優化器在處理計劃過程中出現大量內存使用, 遍歷圖緩慢等問題。針對超大型查詢計劃, 我們開發了以下技術解決。

方案

圖優化

每一個查詢計劃都是由關系算子組成的有向無環圖, 圖的遍歷方向為從輸出到輸入。
而優化器主要的工作是對圖中的算子模式進行匹配, 并且使用新的算子結構替換圖中舊的算子結構。

Digest 全局復用

Digest(完整摘要) 表達了關系算子的任意部分的完整信息, 是優化器識別關系算子的關鍵。 每次變換生成新的關系算子, 都需要構造關系算子整體 Digest, 包含類型信息 Digest/標量函數Digest 等。

我們支持了對這三類信息的緩存以及局部復用。 由于實際計劃中存在大量相似信息結構, 在實際優化過程中將相關對象哈希和相等比較計算復雜度, 以及所需內存空間降低了幾個數量級。

以類型信息為例

價值

通過超大規模查詢優化技術,MaxCompute 突破優化器瓶頸,實現 深度嵌套、復雜類型、百萬級算子 執行計劃的高效處理。在典型大型查詢中, 優化耗時從15分鐘+降至1分鐘, 峰值內存從 5GB+ 降低至 1GB。

Intelligent Tuning

痛點

在大數據計算場景下,因為統計信息的缺失、大量存在的UDF優化黑盒、作業復雜度高(如GoTerra的SQL經常有幾千行)等等因素,使得優化器很難做準確的基數估計,產生最優的執行計劃,以及難以事先給定一個理想的各stage資源分配計劃。

這就導致一方面系統miss了大量的優化機會,另一方面用戶對關心的作業往往需要進行手動調優,如調整各stage并發度、添加調優flag等,費時費力門檻高,并且當數據和作業發生變化時,還需要進行相應的調整。

Intelligent Tuning就是要解決這一系統和用戶的痛點,對于計算邏輯基本相似的recurring job,能夠充分利用歷史執行信息,來對未來執行起到指導作用,從而能夠做到系統自動優化,提升作業整體性能。

方案

我們的主要思路是收集作業實際運行的豐富的統計信息,經過實時的feedback或者離線的更加復雜的training和分析后,使得優化器能夠學習到作業的歷史執行狀態,更加聰明地“理解數據、理解作業”,一方面將歷史統計信息注入到CBO框架中產生全局最優的執行計劃,另一方面根據每個stage的計算量、運行速度等,智能地調整并發度,避免worker資源的浪費,以及自動對并發度偏低的stage進行加速。

架構圖

下圖列舉了Intelligent Tuning整體的優化能力,包括執行計劃優化、資源分配優化、執行模式選擇優化、以及runtime算子執行優化。Intelligent Tuning具備框架性的優化擴展能力,一方面能夠自動利用CBO框架去讓一些優化規則生效,另一方面也能不斷拓展作業運行方方面面的優化。

價值

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 將為大規模數據場景下的企業提供更強的性能保障和更高的運維效率,加速業務價值釋放,助力客戶應對未來更為復雜的大數據挑戰。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91285.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91285.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91285.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MySQL集群架構與實踐3】使用Dcoker實現讀寫分離

目錄 一. 在Docker中安裝ShardingSphere 二 實踐&#xff1a;讀寫分離 2.1 應用場景 2.2 架構圖 2.3 服務器規劃 2.4 啟動數據庫服務器 2.5. 配置讀寫分離 2.6 日志配置 2.7 重啟ShardingSphere 2.8 測試 2.9. 負載均衡 2.9.1. 隨機負載均衡算法示例 2.9.2. 輪詢負…

maven的阿里云鏡像地址

在 Maven 中配置阿里云鏡像可以加速依賴包的下載&#xff0c;尤其是國內環境下效果明顯。以下是阿里云 Maven 鏡像的配置方式&#xff1a; 配置步驟&#xff1a;找到 Maven 的配置文件 settings.xml 全局配置&#xff1a;位于 Maven 安裝目錄的 conf/settings.xml用戶級配置&am…

大語言模型信息抽取系統解析

這段代碼實現了一個基于大語言模型的信息抽取系統&#xff0c;能夠從金融和新聞類文本中提取結構化信息。下面我將詳細解析整個代碼的結構和功能。1. 代碼整體結構代碼主要分為以下幾個部分&#xff1a;模式定義&#xff1a;定義不同領域(金融、新聞)需要抽取的實體類型示例數據…

Next實習項目總結串聯講解(一)

下面是一些 Next.js 前端面試中常見且具深度的問題&#xff0c;按照邏輯模塊整理&#xff0c;同時提供示范回答建議&#xff0c;便于你條理清晰地展示理解與實踐經驗。 ? 面試講述結構建議 先講 Next.js 是什么&#xff0c;它為什么比 React 更高級。(支持 SSR/SSG/ISR,提升S…

React開發依賴分析

1. React小案例&#xff1a; 在界面顯示一個文本&#xff1a;Hello World點擊按鈕后&#xff0c;文本改為為&#xff1a;Hello React 2. React開發依賴 2.1. 開發React必須依賴三個庫&#xff1a; 2.1.1. react: 包含react所必須的核心代碼2.1.2. react-dom: react渲染在不同平…

工具(一)Cursor

目錄 一、介紹 二、如何打開文件 1、從idea跳轉文件 2、單獨打開項目 三、常見使用 1、Chat 窗口 Ask 對話模式 1.1、使用技巧 1.2 發送和使用 codebase 發送區別 1.3、問題快速修復 2、Chat 窗口 Agent 對話模式 2.1、agent模式功能 2.2、Chat 窗口回滾&撤銷 2.3…

Prompt編寫規范指引

1、&#x1f4d6; 引言 隨著人工智能生成內容&#xff08;AIGC&#xff09;技術的快速發展&#xff0c;越來越多的開發者開始利用AIGC工具來輔助代碼編寫。然而&#xff0c;如何編寫有效的提示詞&#xff08;Prompt&#xff09;以引導AIGC生成高質量的代碼&#xff0c;成為了許…

自我學習----繪制Mark點

在PCB的Layout過程中我們需在光板上放置Mark點以方便生產時的光學定位&#xff08;三點定位&#xff09;&#xff1b;我個人Mark點繪制步驟如下&#xff1a; layer層&#xff1a;1.放置直徑1mm的焊盤&#xff08;無網絡連接&#xff09; 2.放置一個圓直徑2mm&#xff0c;圓心與…

2025年財稅行業拓客破局:小藍本財稅版AI拓客系統助力高效拓客

2025年&#xff0c;在"金稅四期"全面實施的背景下&#xff0c;中國財稅服務市場迎來爆發式增長&#xff0c;根據最新的市場研究報告&#xff0c;2025年中國財稅服務行業產值將達2725.7億元。然而&#xff0c;行業高速發展的背后&#xff0c;80%的財稅公司卻陷入獲客成…

雙向鏈表,對其實現頭插入,尾插入以及遍歷倒序輸出

1.創建一個節點&#xff0c;并將鏈表的首節點返回創建一個獨立節點&#xff0c;沒有和原鏈表產生任何關系#include "head.h"typedef struct Node { int num; struct Node*pNext; struct Node*pPer; }NODE;后續代碼&#xff1a;NODE*createNode(int value) {NODE*new …

2025年自動化工程與計算機網絡國際會議(ICAECN 2025)

2025年自動化工程與計算機網絡國際會議&#xff08;ICAECN 2025&#xff09; 2025 International Conference on Automation Engineering and Computer Networks一、大會信息會議簡稱&#xff1a;ICAECN 2025 大會地點&#xff1a;中國柳州 審稿通知&#xff1a;投稿后2-3日內通…

12.Origin2021如何繪制誤差帶圖?

12.Origin2021如何繪制誤差帶圖?選中Y3列→點擊統計→選擇描述統計→選擇行統計→選擇打開對話框輸入范圍選擇B列到D列點擊輸出量→勾選均值和標準差Control選擇下面三列點擊繪圖→選擇基礎2D圖→選擇誤差帶圖雙擊圖像→選擇符號和顏色點擊第二個Sheet1→點擊誤差棒→連接選擇…

如何使用API接口獲取淘寶店鋪訂單信息

要獲取淘寶店鋪的訂單信息&#xff0c;您需要通過淘寶開放平臺(Taobao Open Platform, TOP)提供的API接口來實現。以下是詳細步驟&#xff1a;1. 注冊淘寶開放平臺賬號訪問淘寶開放平臺注冊開發者賬號并完成實名認證創建應用獲取App Key和App Secret2. 申請API權限在"我的…

【Kiro Code 從入門到精通】重要的功能

一、Kiro 是什么&#xff1f; Kiro 是一款智能型集成開發環境&#xff08;IDE&#xff09;&#xff0c;借助規格說明&#xff08;specs&#xff09;、向導&#xff08;steer&#xff09;、鉤子&#xff08;hooks&#xff09;幫助你高效完成工作。 二、Specs 規格說明 規范&…

直播間里的酒旅新故事:內容正在重構消費鏈路

文/李樂編輯/子夜今年暑期&#xff0c;旅游的熱浪席卷全國。機場、火車站人潮涌動&#xff0c;電子屏上滾動的航班信息與檢票口前的長隊交織成繁忙的出行圖景&#xff0c;酒店預訂量也在這股熱潮中節節攀升。連線 Insight關注到&#xff0c;今年的暑期游有了一些新變化&#xf…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | VerifyAccountUi(驗證碼組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— VerifyAccountUi組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 語法結合 Tailwind CS…

AbstractAuthenticationToken 認證流程中??認證令牌的核心抽象類詳解

AbstractAuthenticationToken 認證流程中??認證令牌的核心抽象類詳解在 Spring Security 中&#xff0c;AbstractAuthenticationToken 是 Authentication 接口的??抽象實現類??&#xff0c;其核心作用是為具體的認證令牌&#xff08;如用戶名密碼令牌、JWT 令牌等&#x…

小程序視頻播放,與父視圖一致等樣式設置

初始設置的代碼&#xff1a;WXML的代碼<view class"card-wrapper"> <!-- 視頻播放容器&#xff08;默認隱藏&#xff09; --> <view class"video-container" wx:if"{{isPlaying}}"> <video id"cardVideo" class&…

Kafka——關于主題管理

引言在Kafka的世界中&#xff0c;主題&#xff08;Topic&#xff09;是消息的基本組織單位&#xff0c;類似于文件系統中的"文件夾"——所有消息都按照主題分類存儲&#xff0c;生產者向主題寫入消息&#xff0c;消費者從主題讀取消息。主題的管理是Kafka運維的基礎&…

【VLLM】VLLM使用

一 、安裝 二、啟動入口 VLLM 提供了多種入口方式啟動模型&#xff0c;以適應不同的使用場景&#xff08;如命令行交互、API 服務、自定義集成等&#xff09;。除了最常用的 openai.api_server&#xff08;OpenAI 兼容 API 服務&#xff09;&#xff0c;還有以下主要入口&#…