深入理解 Doris Compaction:提升查詢性能的幕后功臣

在這里插入圖片描述
在 Doris 的數據存儲與查詢體系里,Compaction 是保障查詢效率、優化存儲結構的關鍵機制。如果你好奇 Doris 如何在高頻寫入后仍能高效響應查詢,或是想解決數據版本膨脹帶來的性能問題,這篇關于 Compaction 的深度解析值得收藏 👇

一、為什么需要 Compaction?

Doris 采用類 LSM - Tree 的存儲結構,每次數據導入會生成新的 Rowset(可理解為數據版本片段 ),每個rowset由0到n個sgement組成。segment實際對應這個磁盤上的一個文件。單個sgement文件是有序的。

存儲文件目錄結構

隨著導入操作增多,Rowset 數量不斷累積,會引發兩大核心問題:

(一)查詢效率下降

查詢時,Doris 需要對多個 Rowset 執行 “多路歸并” 操作來整合結果。Rowset 數量越多,歸并的路數就越多,查詢耗時呈幾何級增長。例如,若一個查詢需要合并 10 個 Rowset,歸并過程就像同時梳理 10 條雜亂的線,難度和耗時遠大于合并 2 - 3 個 Rowset。

(二)存儲成本上升

大量零散的 Rowset 會占用更多磁盤空間,還可能存儲重疊和無效數據。比如多次導入同一范圍的數據,會生成多個有重疊的 Rowset,不僅浪費存儲,還會讓查詢時的歸并邏輯更復雜。

Compaction 的核心目標

  • 減少查詢歸并成本:將多個小 Rowset 合并為大 Rowset,降低查詢時的合并路數。
  • 消除無效數據:將標記刪除(Delete)、更新(Update)的數據真正清理,避免查詢時的無效掃描。
  • 優化存儲:在 Aggregate 模型中預聚合相同 Key 的數據,在 Unique 模型中保留最新版本,進一步提升查詢效率。

compaction的粒度是tablet,下圖是一個tablet compaction過程的示意圖

tablet 的 compaction過程

二、Compaction 關鍵概念解析

1. Compaction Score:優先級調度指標

Compaction Score 是 Doris 判斷 Tablet 做Compaction優先級的核心指標,值越高,優先級越高

(一)本質

反映查詢時 Rowset 參與 “多路歸并” 的路數。路數越多,查詢效率越低,越需要優先compaction。

(二)計算邏輯

遍歷 Tablet 的 Rowset,根據其數據重疊情況統計歸并路數:

若某 Tablet 的 Rowset 分布如下:

"rowsets": ["[0-100] 3 DATA NONOVERLAPPING ...", // 無重疊,歸并占 1 路 "[101-101] 2 DATA OVERLAPPING ...",  // 有重疊,歸并占 2 路 "[102-102] 1 DATA NONOVERLAPPING ..." // 無重疊,歸并占 1 路 
]
  • 無重疊 Rowset:如 [0-100] 范圍的 Rowset 由 3 個Segment 組成,但是沒有但是沒有overlap,查詢歸并時僅占 1 路;

  • 有重疊 Rowset:如 [101-101] 范圍的 Rowset 由 2 個Segment 組成,但是有但是有overlap,查詢歸并時占 2 路。

則 Compaction Score = 1(第一行) + 2(第二行) + 1(第三行) = 4

2. Base & Cumulative Compaction:分層合并策略

為了平衡 “壓縮效率” 和 “數據合并成本”,Doris 采用分層壓縮思路:

(1)Cumulative Compaction
  • 作用:優先合并新寫入的小 Rowset,避免直接與大 Rowset 合并導致效率低下。新導入的零散數據(如實時寫入的小批次數據 ),先通過Cumulative Compaction逐步 “攢大”,減少后續 Base Compaction 的壓力。
(2)Base Compaction
  • 作用:當Cumulative Rowset 合并到一定規模后,再與 ** 歷史大 Rowset(Base Rowset)** 合并,最終形成更緊湊的大 Rowset,徹底優化查詢路數。
(3)Cumulative Point:分層 “臨界點”

用來劃分 “Cumulative Rowset” 和 “Base Rowset” 的邊界。比如某 Tablet 的 Cumulative Point 為 293,意味著:

compaction圖

  • Rowset 范圍 293+ 做的是 Cumulative Compaction;

  • Rowset 范圍 0-292 做的是 Base Compaction。

三、Compaction 工作流程:生產者 - 消費者模式

Doris 的 Compaction 流程遵循生產者 - 消費者模型,可拆解為 4 大核心步驟,每個步驟都蘊含精細的設計邏輯:

1. 掃描與優先級計算(生產者線程)

BE 的 Compaction 生產者線程定時(可配置掃描間隔)掃描所有 Tablet,執行以下操作:

(一)計算 Compaction Score

遍歷 Tablet 的 Rowset,統計每個 Rowset 在查詢時的歸并路數,累加得到 Compaction Score,確定compaction優先級。

(二)分層任務調度

Doris 通過輪詢策略平衡 Base 和 Cumulative Compaction 的資源占用:

  • 默認每 10 輪掃描選 1 次 Base Compaction 任務(處理歷史大 Rowset 合并 );

  • 其余 9 輪選 Cumulative Compaction 任務(快速合并新寫入的小 Rowset )。

    這樣設計的原因是:Base Compaction 通常涉及更大數據量,資源消耗更高,需控制執行頻率;而 Cumulative Compaction 處理小數據,可高頻執行以快速優化查詢。

2. 并發控制:避免磁盤過載

磁盤的 IO 帶寬和處理能力是有限的,若同時執行過多 Compaction 任務,會導致磁盤性能雪崩(比如磁盤 IO 利用率瞬間 100%,其他讀寫操作阻塞 )。因此,Doris 會:

(一)檢查當前任務數

查詢磁盤當前運行的 Compaction 任務數,與配置的compaction的線程數對比。

(二)動態跳過機制

若任務數已達閾值,跳過該 Tablet,等待下一輪掃描;若未超限,允許任務繼續,確保磁盤資源合理利用。

3. Rowset 篩選策略

并非所有 Rowset 都會被選中壓縮,篩選邏輯聚焦兩點,這直接影響 Compaction 的效率和效果:

(一)連續性優先

優先選擇連續的 Rowset(如按時間或數據范圍連續 ),因為零散的 Rowset 合并后,能減少查詢時歸并的 “碎片問題”。例如,連續的 Rowset 合并后,查詢時可一次性歸并,而零散 Rowset 可能需要多次跳轉磁盤讀取。

(二)數據量均衡

避免合并 “大小差距極大” 的 Rowset。在多路歸并排序中,若 Rowset 數據量差距過大,歸并時小 Rowset 會快速處理完,大 Rowset 仍需大量時間,整體效率會斷崖式下跌。因此,篩選時會優先選數據量相近的 Rowset,保證歸并過程的高效性。

4. 任務分發:分線程池執行

為了隔離 Base Compaction ·和 Cumulative Compaction 的資源,Doris 設計了兩個獨立線程池。

Base compaction線程池和cumulative compaction線程池分別從隊列中取出compaction task任務后,執行多路歸并排序:將多個 Rowset 的數據按順序合并,生成一個新的大 Rowset。

Compaction工作流程圖

四、總結:Compaction 是效率與成本的平衡藝術

理解 Compaction 的邏輯后,再面對 “查詢變慢”“存儲膨脹” 等問題時,就能從 “數據版本管理” 的視角切入,精準定位與解決。下次遇到 Doris 性能瓶頸,不妨先看看 Compaction 是否在 “默默加班”,是否因配置或數據模式問題導致其 “有心無力”~

如果覺得內容有幫助,歡迎點贊、在看、分享,讓更多人了解 Doris 性能優化的幕后邏輯~ 有疑問或補充,也可在評論區交流,一起深入了解 Doris 技術細節 🌱

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

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

相關文章

css 實現虛線效果的多種方式

使用邊框實現虛線 通過設置元素的邊框樣式來實現虛線效果。以下為示例代碼: .dashed {border: 1px dashed black; }使用 CSS 偽元素實現虛線 使用偽元素來模擬虛線的效果。以下為示例代碼: .dashed::before {content: "";display: block;height: 1px;border-bo…

深入剖析 RocketMQ 分布式事務:原理、流程與實踐

Apache RocketMQ 是一種分布式消息隊列系統,支持分布式事務消息,以確保在分布式系統中數據的一致性。它通過一種基于兩階段提交(2PC)的機制結合補償邏輯來實現分布式事務的最終一致性。以下是對 RocketMQ 分布式事務的詳細講解,包括其核心概念…

具身智能 自動駕駛相關崗位的技術棧與能力地圖

一、硬技能技術棧(優先級排序) 1. 核心領域技術(★★★★★)技術方向具體技能學習建議大模型實戰- VLA架構(RT-2、PaLM-E)開發/微調- 多模態對齊(CLIP、Flamingo)- 生成式策略&#…

實現了加載 正向 碰撞 雅可比 仿真

""" # 此示例從 URDF 文件中加載一個 UR10 機械臂的模型 # 隨后演示 Pinocchio 庫的基本功能,如正向運動學計算 # 雅可比矩陣計算、碰撞檢測以及動力學仿真 """ # 導入 meshcat 的幾何模塊,用于創建和管理可視化的幾何對象 import meshcat.geo…

【0基礎PS】PS工具詳解--畫筆工具

目錄前言一、畫筆工具的位置與快捷鍵?二、畫筆工具選項欄設置?三、畫筆工具的進階應用?四、常見問題及解決方法?總結前言 在 Photoshop 的眾多工具中,畫筆工具無疑是極具創造力和實用性的工具之一。無論是進行圖像繪制、照片修飾,還是特效制作&…

window10和ubuntu22.04雙系統之卸載ubuntu系統

window10和ubuntu22.04雙系統之卸載ubuntu系統)1. 刪除Ubuntu系統占用的磁盤分區(在Windows下操作)2. 刪除ubuntu開機引導項1. winr出來終端提示框后輸入2. 然后會在命令行中顯示電腦的硬盤列表,輸入命令選擇安裝Windows的那個硬盤…

(C++)C++類和類的方法(基礎教程)(與Python類的區別)

前言&#xff1a; 本篇博客建議搭配&#xff1a;&#xff08;Python&#xff09;類和類的方法&#xff08;基礎教程介紹&#xff09;&#xff08;Python基礎教程&#xff09;-CSDN博客 一起學習使用&#xff1b; 源代碼&#xff1a; #include <iostream> #include &…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博文章數據可視化分析-文章分類下拉框實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博文章數據可視化分析-文章分類下拉框實現…

Git命令保姆級教程

Git 入門網站 https://learngitbranching.js.org/?localezh_CN Git 命令 git init // 在本地目錄內部會生成.git文件夾 git initgit clone // 從git服務器拉取代碼 // 代碼下載完成后在當前文件夾中會有一個 shop 的目錄&#xff0c;通過 cd shop 命令進入目錄。 git clone ht…

Java Ai For循環 (day07)

循環結構 for&#xff1a;循環語句的作用&#xff1a;可以將一段代碼重復的執行很多次for 循環語句格式&#xff1a;執行流程&#xff1a; 初始化語句執行條件判斷語句&#xff0c;看結果是 true&#xff0c;還是 false false結束&#xff0c;true繼續執行循環體語句執行條件控…

Directory Opus 使用優化

自定義快捷鍵 Directory Opus 移動標簽到另一欄 設置快捷鍵&#xff1a;ctrl←/→ 設置步驟&#xff1a; 打開【設置】—>選擇【自定義工具欄和快捷鍵】 選擇【新建】—>【新建窗口快捷鍵】 輸入快捷鍵命令 Go TABMOVEother此時可以點擊運行進行測試&#xff0c;…

Qt知識點2『Ubuntu24.04.2安裝Qt5.12.9各種報錯』

問題1&#xff1a;Qt安裝完畢后&#xff0c;新建一個最簡單的測試程序&#xff0c;但是QtCreator左側構建的三個按鈕呈現灰色&#xff0c;無法進行構建操作答&#xff1a;進入QtCreator的Kits界面&#xff08;工具-選項&#xff09;&#xff0c;點擊"自動檢測"下的De…

TS面試題

1.TS有哪些類型&#xff08;對比與js&#xff09;&#xff1f;關鍵字/語法用途示例any關閉類型檢查let a: any 4unknown類型安全的 anylet u: unknown 4; if (typeof u number) …never永不存在的值function err(): never { throw 0; }void無返回值function f(): void {}enu…

借助Early Hints和HarperDB改善網頁性能

對電商網站來說&#xff0c;糟糕的頁面性能可能會增加交易放棄率。一直以來&#xff0c;人們會使用CDN進行緩存從而縮短頁面加載時間&#xff0c;但即便實施了強大的緩存&#xff0c;消費者在通過移動網絡訪問這些網站時可能仍然會需要頻繁等待。最近誕生了一種名為“早期提示”…

MEMS陀螺如何成為無人機穩定飛行的核心?

在無人機自主翱翔、靈活機動并適應多變環境的背后&#xff0c;對其運動狀態——尤其是姿態——的精確感知是基石。作為飛行控制系統&#xff08;飛控&#xff09;的“內耳”&#xff0c;陀螺儀實時捕捉機體繞X、Y、Z三軸的旋轉角速度。這一核心數據是飛控進行姿態解算和維持飛行…

騰訊云拉取docker鏡像失敗怎么辦

ps:我直接按照步驟1和2就解決了 以下內容來自豆包 在騰訊云服務器上拉取 Docker 鏡像失敗&#xff0c;可以按照以下步驟排查和解決&#xff1a; 一、檢查網絡連接 確認服務器網絡正常 bash ping www.baidu.com # 測試公網連通性如果無法 ping 通&#xff0c;檢查服務器防火墻…

Apache FOP實踐——pdf模板引擎

文章目錄 基本概念設計思想具體實踐完整應用 基本概念 Apache FOP&#xff08;Formatting Objects Processor&#xff09;是一個基于Java的開源工具&#xff0c;用于將 XSL-FO&#xff08;XSL Formatting Objects&#xff09; 文檔轉換為PDF、圖像等格式。 設計思想 將內容&…

WebRTC核心組件技術解析:架構、作用與協同機制

引言&#xff1a;WebRTC的技術定位與價值 WebRTC&#xff08;Web Real-Time Communication&#xff09;作為一項開源實時通信標準&#xff0c;已成為瀏覽器原生音視頻交互、P2P數據傳輸的技術基石。自2011年開源以來&#xff0c;其標準化進程由W3C&#xff08;API層&#xff0…

OmniParser:提升工作效率的視覺界面解析工具

OmniParser&#xff1a;基于視覺的用戶界面解析工具在現代軟件開發中&#xff0c;用戶界面的自動化處理變得愈發重要。OmniParser 是一個強大的工具&#xff0c;旨在將用戶界面的截圖解析為結構化的、易于理解的元素&#xff0c;從而顯著提升了大型語言模型&#xff08;如GPT-4…

C#程序員計算器

使用C#語言編寫程序員計算器&#xff0c;使其能夠進行加減乘除和與或非等邏輯運算。 calculator.cs 代碼如下 using System; using System.Numerics; using System.Globalization;namespace Calculator1 {public enum CalcBase { Bin 2, Oct 8, Dec 10, Hex 16 }public en…