在日常的数据分析场景中,我们经常会向 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 中,双引号 "" 和单引号 是完全不同…