深入解析 Apache Doris 寫入原理:一條數據的“落地之旅”

在日常的數據分析場景中,我們經常會向 Apache Doris 寫入大量數據,無論是實時導入、批量導入,還是通過流式寫入。但你是否想過:一條數據從客戶端發出,到最終穩定落盤,中間到底經歷了哪些步驟?

今天我們就來全面拆解 Doris 寫入原理,帶你走進它的內部世界。

1. 整體脈絡

一條寫入數據在 Doris 的“旅程”可以分成若干層次:

入口:客戶端通過 HTTP(Stream Load)、JDBC/SQL(INSERT)、Broker/Spark(批量)、Routine Load(Kafka)等方式把數據送入系統。各種 Load 方法的分類和用途說明鏈接。

FE 層(協調):SQL 解析、計劃、事務分配、路由與元數據管理(表/分區/Tablet 信息由 FE 管理并存儲)。

BE 層(執行):負責真實的數據寫入、內存結構、落盤(Segment)、索引構建、Compaction、查詢執行。

2. 寫入模式

選擇合適的寫入模式是發揮 Doris 性能的前提。不同模式的事務粒度、資源占用、延遲表現差異顯著,需根據業務需求精準選型。

寫入模式傳輸協議典型場景延遲吞吐能力事務特征
Stream LoadHTTP實時日志、訂單數據導入秒級高(GB / 分)單事務,支持導入任務級重試
Routine LoadKafka 協議Kafka 日志流持續同步秒級中高分區級事務,支持斷點續傳
Broker Load內部 RPCHDFS/S3 離線批量數據加載分鐘級極高(TB / 時)單事務,支持大文件切分并行導入
Spark LoadSpark API超大規模數據集(>10TB)小時級極高分布式事務,依賴 Spark 集群
Insert IntoMySQL/JDBC手動補數、低并發小批量寫入秒級單條 / 批量事務,支持事務回滾

3. 寫入流程關鍵內容解析

3.1 數據接收與請求解析

流程細分:

  • 客戶端通過 HTTP / MySQL 協議向 FE 或 BE 發起寫入請求。
  • 如果請求到 FE:FE 做 SQL 解析(SQL parser)、語義校驗(列類型、分區存在性等)、權限校驗。
  • FE 根據目標表的分區/分桶/Distribution 信息,執行 路由決策:確定目標 Tablet(或者多個 Tablet)。
  • FE 為該寫入分配一個 事務 ID(Txn ID) 或者在批量場景下分配批次標識,用來跟蹤后續的各個 BE 寫入結果與可見性。

3.2 BE 的內存寫入 — MemTable

核心流程:

  • BE 在接收到寫入行后,會采用了類 LSM 樹的結構,將數據先寫到 Memtable 中,當 Memtable 數據寫滿后,才會進行下一步數據寫入。
  • MemTable 在邏輯上做去重/聚合/排序(取決于表類型:Duplicate/Unique/Aggregate)。如主鍵表會在內存階段做主鍵合并或覆蓋邏輯。

內部細節:

  • 數據格式化:將網絡序列化數據解析為內部列式/行式表示(列式更利于壓縮與向量化)。
  • 短鍵索引構建(Short key / MinMax):MemTable 會收集用于快速定位的小索引信息(比如每個塊的最小/最大值、短鍵)。
  • 鎖與并發控制:寫入到同一個 Tablet 的并發寫請求需要合適的并發控制(同 Tablet 同步或分區內并發寫控制),以保證事務語義。

3.3 Flush 到磁盤 — 生成 Segment 文件

Flush 過程

  • 當Memtable數據寫滿后,會異步flush生成一個Segment進行持久化,同時生成一個新的Memtable繼續接收新增數據導入

  • 在寫入磁盤前會做最終的編碼、壓縮、索引構建(如短鍵索引、列級統計信息、ZoneMap/MinMax),并生成元數據描述該 Segment(如行數、列偏移、壓縮方式)。

3.4 事務管理與元數據發布

事務與可見性

  • FE 為寫入分配 Txn ID / Version,用來保證原子性和版本管理。
  • BE 在本地成功寫入 Segment 后,會向 FE 匯報“寫入完成并持久化”的消息(包含生成的 Segment 元信息)。
  • FE 收到足夠的確認(通常基于多數副本策略)后,會發 Publish 任務使導入的 Rowset 版本生效。任務中指定了發布的生效 version 版本信息。之后 BE 存儲層才會將這個版本的 Rowset 設置為可見。最后Rowset 加入到 BE 存儲層的 Tablet 進行管理。

元數據更新

  • FE 在提交時更新元數據(Tablet 的版本、Segment 列表、事務日志),并把新的元信息持久化到元存儲。

3.5 后臺優化:Compaction(合并)

為什么需要 Compaction

  • 寫入產生許多小的 rowset(小文件),長期積累會:
  • 增加查詢時需要掃描的文件數(查詢隨機 IO 增多)。
  • 增大元數據開銷。

compaction過程示意圖

常見 Compaction 策略:

  • Cumulative Compaction:優先合并新寫入的小 Rowset,避免直接與大 Rowset 合并導致效率低下。新導入的零散數據(如實時寫入的小批次數據 ),先通過Cumulative Compaction逐步 “攢大”,減少后續 Base Compaction 的壓力。。
  • Base Compaction:當Cumulative Rowset 合并到一定規模后,再與 歷史大 Rowset(Base Rowset)合并,最終形成更緊湊的大 Rowset。

更多Compaction原理與優化可參考鏈接內容

4. 總結

一條數據寫入到 Doris 的旅程包含多個環節,理解數據寫入的每個環節(MemTable、Flush、Compaction、FE 事務等),能夠更好的幫助我們優化寫入性能與穩定性。

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

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

相關文章

基于MATLAB的視頻動態目標跟蹤檢測實現方案

一、系統架構設計 視頻動態目標跟蹤系統包含以下核心模塊: 視頻輸入模塊:支持攝像頭實時采集或視頻文件讀取預處理模塊:灰度轉換、降噪、光照補償目標檢測模塊:背景建模、運動區域提取跟蹤算法模塊:卡爾曼濾波、粒子濾…

【Python】Python文件操作

Python文件操作 文章目錄Python文件操作[toc]1.文件的編碼2.文件打開、讀取(r模式)、關閉3.文件的寫入(w模式)4.文件的追加寫入(a模式)5.綜合案例1.文件的編碼 意義:計算機只能識別0和1&#x…

CES Asia的“五年計劃”:打造與北美展比肩的科技影響力

在全球科技產業版圖中,展會一直是前沿技術展示、行業趨勢探討以及商業合作達成的關鍵平臺。CES Asia(亞洲消費電子技術展)作為亞洲科技領域的重要展會,近日明確提出其“五年計劃”,目標是打造與北美展會比肩的科技影響…

【計算機網絡 | 第16篇】DNS域名工作原理

文章目錄3.5 域名系統工作原理主機的標識方式:域名 vs IP 地址標識轉換機制:DNS系統因特網的域名系統:層次域名空間🐦?🔥頂級域名分類低級域名與管理域名與IP的區別因特網的域名系統:域名服務器&#x1f9…

YASKAWA安川機器人鋁材焊接節氣之道

在鋁材焊接領域,保護氣體的合理使用對焊接質量與成本控制至關重要。安川焊接機器人憑借高精度與穩定性成為行業常用設備,而WGFACS節氣裝置的應用,則為其在鋁材焊接過程中實現高效節氣提供了創新路徑。掌握二者結合的節氣之道,對提…

GooseDB,一款實現服務器客戶端模式的DuckDB

在網上看到韓國公司開發的一款GooseDB, 官方網站對它的介紹是DuckDB? 的功能擴展分支,具有服務器/客戶端、多會話和并發寫入支持,使用 PostgreSQL 有線協議(DuckDB?是 DuckDB 基金會的商標) 使用也很簡單&#xff…

lesson62:JavaScript對象進化:ES2025新特性深度解析與實戰指南

目錄 一、迭代器輔助方法:對象數據處理的優雅革命 1.1 核心方法與語法 1.2 對象屬性處理實戰 1.3 性能與兼容性考量 二、JSON模塊原生支持:對象加載的范式轉變 2.1 靜態與動態導入語法 2.2 與傳統方案的對比優勢 2.3 典型應用場景 三、Set集合增…

設計模式學習筆記(一)

設計模式學習筆記(一) 一般說設計模式都是指面向對象的設計模式,因為面向對象語言可以借助封裝、繼承、多態等特性更好的達到復用性、可拓展性、可維護性。 面向對象一般指以類、對象為組織代碼的基本單元,并將封裝、繼承、多態、…

【CSS】一個自適應大小的父元素,如何讓子元素的寬高比一直是2:1

父元素是自適應大小的容器(比如 width:100%),我們希望子元素 始終保持 2:1 寬高比(比如寬 200px → 高 100px,寬 300px → 高 150px)。 有幾種常見解法:? 方法一:CSS aspect-ratio&…

如何搭建redis集群(docker方式非哨兵)

1、redis的配置文件這里要注意,主從的ip不需要我們去設置,只需要設置主從的密碼就可以,然后就是protect-mode,我設置的是no,一定注意不能設置主從。客戶端要訪問,一定要加# 每個節點的 redis.conf 中 clust…

如何學習VBA_3.3.9:利用“搭積木”思想,快速有效地完成你的代碼

我給VBA的定義:VBA是個人小型自動化處理的有效工具。利用好了,可以大大提高自己的勞動效率,而且可以提高數據處理的準確度。我推出的VBA系列教程共九套和一部VBA漢英手冊,現在已經全部完成,希望大家利用、學習。如果您…

JSP程序設計之輸入/輸出對象 — response對象

response對象1.概述2.實例:response對象方法運用(1)實例一:頁面自動刷新(2)實例二:實現頁面重定向,具體的代碼(3)綜合實例:實現登錄并記錄用戶名1…

Redis 事件驅動框架(ae.c_ae.h)深度解析

Redis 事件驅動框架(ae.c/ae.h)深度解析 之前咱們用 “超市收銀員” 的例子,簡單看懂了 ae 模塊是 Redis 的 “多任務神器”。現在咱們再往深走一層,不用復雜代碼,只拆它的 “核心運作邏輯”—— 搞懂它怎么做到 “一個…

[能源化工] 面向鋰電池RUL預測的開源項目全景速覽

鋰離子電池是新能源汽車、儲能系統及便攜式電子設備的核心能源部件,其剩余使用壽命(Remaining Useful Life,RUL)的準確預測直接關系到設備運行安全、維護成本優化和能源效率提升。RUL預測算法能夠提前量化電池剩余可用時間&#x…

PEFT QLora Deepspeed Zero Stage 3 Offload Trainning

使用 accelerate deepspeed zero stage 3 offload 進行 sft trainning 的自動設備映射: GPU 訓練計算 CPU 存儲 run_peft_qlora_deepspeed_stage3.sh #!/bin/bashexport MAX_JOBS4 export OMP_NUM_THREADS4 export disable_exllamaTrue export CUDA_VISIBLE_DEVICES0,1 expor…

JAVA上門家政維修服務系統源碼微信小程序+微信公眾號+APP+H5

一、功能介紹用戶端:精準分類、支持家政、維修、萬能服務、一口價、報價、線上、各類家政服務、優惠專區、師傅入駐、商家入駐、我的需求、補費明細、我的投訴;師傅端:接單池、消息通知、接單管理、今日訂單、師傅入駐、我的錢包、實名認證&a…

GCKontrol對嵌入式設備FPGA設計流程的高效優化

1 前言FPGA(Field-Programmable Gate Array,現場可編程邏輯門陣列)是一種可編程的半導體器件,因其硬件可重構性、硬件并行計算能力、低延遲和實時性的優勢,廣泛應用于數字電路設計、原型驗證和系統加速等領域。但開發…

DBAPI免費版對比apiSQL免費版

DBAPI簡介 零代碼開發api服務,只需編寫sql,就可以生成http api服務。支持api動態創建,兼容多種數據庫。 適用于BI報表、數據可視化大屏的后端接口快速開發。 旨在為企業數據服務的發布提供完整解決方案 一、DBAPI免費版本支持1個數據源連接支…

CTFHub SSRF通關筆記8:數字IP Bypass 原理詳解與滲透實戰

目錄 一、SSRF 二、數字IP原理 1、IP多進制 (1)十進制整數格式 (Dword / 長整數格式) (2)八進制格式 (Octal IP) (3)十六進制格式 (Hex IP) 2、SSRF繞過 三、滲透實戰 1、打開靶場 2、嘗試127.0.…

C++中雙引號和單引號的區別(全面分析)

我在刷算法題的時候經常遇到,用了 出現警告或者使用" "直接報錯,尤其是在字符串部分(py玩家后遺癥/(ㄒoㄒ)/~~)在詳細了解后總結一下加強記憶。 總的來說在 C 中,雙引號 "" 和單引號 是完全不同…