【Doris基础】Apache Doris中的Segment详解:存储与查询的核心组件

article/2025/6/24 1:36:47

目录

1 Segment概述

1.1 什么是Segment

1.2 Segment的重要性

2 Segment的物理结构

2.1 Segment文件组成

2.2 列数据存储格式

3 Segment的生命周期

3.1 Segment创建

3.2 Segment合并(Compaction)

3.3 Segment过期与清理

4 Segment与查询处理

4.1 查询中的Segment剪枝

4.2 并行查询处理

5 Segment优化策略

5.1 Segment大小优化

5.2 索引优化

5.3 数据组织优化

6 Segment监控与管理

6.1 关键监控指标

6.2 常用管理命令

7 Segment高级特性

7.1 部分更新

7.2 物化视图Segment

7.3 Segment缓存

8 总结


1 Segment概述

Apache Doris(原百度Palo)是一个现代化的MPP(大规模并行处理)分析型数据库系统,而Segment是Doris存储引擎中的核心概念之一。理解Segment对于深入掌握Doris的工作原理和性能优化至关重要。

1.1 什么是Segment

在Doris中,Segment是指表数据按照分区(Partition)和分桶(Bucket)规则划分后,每个Tablet内部进一步划分的数据单元。它是Doris中最小的物理存储单元,也是数据导入、压缩、合并(Compaction)和查询处理的基本单位。

1.2 Segment的重要性

Segment的设计直接影响着Doris的多个关键性能指标:
  • 查询性能:查询时只需要扫描相关的Segment,避免全表扫描
  • 导入性能:数据可以并行写入多个Segment
  • 存储效率:Segment级别的压缩和编码优化存储空间
  • 数据新鲜度:通过Segment实现数据的快速导入和可见

2 Segment的物理结构

2.1 Segment文件组成

每个Segment在物理存储上由多个文件组成,典型的Segment文件结构如下:
文件组成说明
Header文件:存储Segment的元信息,如版本号、行数、创建时间等
数据文件
  • 列数据文件:存储实际的列数据,采用列式存储格式
  • 删除条件文件:记录该Segment中被标记删除的数据
索引文件
  • 前缀索引:加速等值查询和范围查询
  • ZoneMap索引:存储每个数据块的min/max值,用于快速过滤
  • BloomFilter索引:用于高效判断数据是否存在
  • Bitmap索引:适用于低基数列的高效过滤

2.2 列数据存储格式

Doris中的Segment采用列式存储格式,每个列的数据独立存储。列数据文件内部又分为多个数据页(Page),每个Page是压缩和编码的基本单位。
列存储优势
  • 高压缩率:同类数据压缩效果更好
  • 查询高效:只需读取查询涉及的列
  • 向量化执行:适合现代CPU的SIMD指令

3 Segment的生命周期

3.1 Segment创建

Segment在数据导入时创建,主要流程如下:
关键步骤说明
  • 分配Tablet和Segment:FE根据分区分桶规则确定数据应该写入哪个Tablet,并在对应的BE上创建Segment
  • 创建临时Segment:BE先创建临时Segment接收数据
  • 写入数据:数据按列组织,并构建各类索引
  • 提交Segment:数据写入完成后,临时Segment转为正式Segment
  • 元数据汇报:BE向FE汇报新增的Segment信息

3.2 Segment合并(Compaction)

随着数据不断导入,系统中会积累大量小Segment,影响查询性能。Doris通过Compaction过程合并小Segment。
合并类型
  • 基线合并(Base Compaction):合并多个Segment为一个较大的Segment
  • 增量合并(Cumulative Compaction):合并最近导入的小Segment

3.3 Segment过期与清理

Segment会根据表的TTL(Time-To-Live)设置自动过期并被清理:

4 Segment与查询处理

4.1 查询中的Segment剪枝

Doris查询引擎会尽可能跳过不相关的Segment,这一过程称为Segment剪枝:
分区剪枝:利用分区条件跳过整个分区
分桶剪枝:利用分桶条件跳过不相关的Tablet
Segment级剪枝
  • 使用ZoneMap索引跳过不包含目标数据的Segment
  • 使用BloomFilter快速判断数据是否存在

4.2 并行查询处理

Doris的MPP架构可以在多个Segment上并行执行查询:

5 Segment优化策略

5.1 Segment大小优化

合理的Segment大小对性能至关重要:
  • 过小Segment问题
    • 元数据膨胀
    • 查询时需要打开大量文件
    • Compaction压力大
  • 过大Segment问题
    • 导入延迟高
    • 不利于并行查询
    • 故障恢复成本高
推荐配置
  • 单个Segment大小建议在100MB-1GB之间
  • 通过tablet_size参数控制Tablet大小间接影响Segment大小

5.2 索引优化

索引选择策略
  • 高基数列:BloomFilter或前缀索引
  • 低基数列:Bitmap索引
  • 数值范围查询:ZoneMap索引
  • 等值查询:前缀索引

5.3 数据组织优化

  • 排序键设计:将常用过滤条件列设为排序键,提高ZoneMap索引效率
  • 数据局部性:相关数据尽量组织在同一Segment
  • 冷热分离:通过分区策略将热数据与冷数据分开

6 Segment监控与管理

6.1 关键监控指标

6.2 常用管理命令

  • 查看Segment信息:
SHOW TABLETS FROM table_name;
  • 手动触发Compaction:
ADMIN COMPACT TABLE table_name;
  • 查看Segment元数据:
SHOW TABLET tablet_id;

7 Segment高级特性

7.1 部分更新

Doris支持Segment级别的部分列更新:

7.2 物化视图Segment

物化视图在Doris中也以Segment形式存储:

7.3 Segment缓存

BE会缓存热点Segment数据加速查询:

8 总结

Segment作为Doris存储引擎的核心组件,其设计直接影响系统的导入性能、查询效率和存储成本。通过合理配置Segment大小、精心设计索引策略以及有效管理Segment生命周期,可以充分发挥Doris在高性能分析场景下的优势。
在实际应用中,建议根据业务特点监控Segment相关指标,定期优化表结构,并利用Doris提供的丰富工具进行性能调优,以获得最佳的系统表现。

http://www.hkcw.cn/article/tvkiIHndZv.shtml

相关文章

JAVA中的枚举

代码示例 理论 枚举的行为多态 public enum MyLockStrategy {SKIP_FAST(){Overridepublic boolean tryLock(RLock lock, MyLock prop) throws InterruptedException {return lock.tryLock(0, prop.leaseTime(), prop.unit());}},FAIL_AFTER_RETRY_TIMEOUT(){Overridepublic bo…

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!

介绍 3DP Chip 是一款免费的驱动程序更新工具,可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用:用户界面简洁明了,操作方便,…

day61—DFS—省份数量(LeetCode-547)

题目描述 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市…

MySql(十)

目录 准备工作 1)准备一张表 2)插入数据 1.排序 1--asc 升序 2--desc 降序 3--组合排序 2.聚合函数 1.count(字段名) 2.sum(字段名) 3.max(字段名) 4.min(字段名) 5.avg(字段名) 准备工作 1)准备一张表 CREATE table role(roleid INT PRIMAR…

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中,Val (Sgnl) 属性(Value (Signaling))是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同,Val (Sgnl) 在修改控件值的同时强制生成值改变事件,确保程序逻辑与 UI 交互保持…

解常微分方程组

Euler法 function euler_method % 参数设置 v_missile 450; % 导弹速度 km/h v_enemy 90; % 敌艇速度 km/h % 初始条件 x0 0; % 导弹初始位置 x y0 0; % 导弹初始位置 y xe0 120; % 敌艇初始位置 y t0 0; % 初始时间 % 时间步长和总时间 dt 0.01; % 时间步长 t_final …

「Java教案」数据类型、变量与常量

课程目标 1.知识目标 能够根据Java基本数据类型的分类、存储规则及适用场景,合理的选择数据类型。能在合适的场景下正确声明和定义变量和常量。能够根据显式和隐式数据类型转换的规则与风险,合理的进行数据类型转换。 2.能力目…

本地部署基于 Kibana 开源搜索引擎 Elasticsearch 并实现外部访问

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。Kibana 是一个开源可视化工具,用于与 Elasticsearch 进行集成,提供大量数据分析。 本文将详细的介绍如何利用 Docker 在本地部署…

【Ollama】windows部署ollama并运行模型

一、Ollama安装 1.下载Ollama 官网&#xff1a;https://ollama.com/ 2.安装 点击下载 安装完成后打开cmd窗口 键盘按住WinR输入cmd 3.Ollama常用指令 指令说明ollama list查看本地已下载的模型列表ollama pull <模型名>下载模型&#xff08;如 ollama pull llama…

Linux入门(十二)服务管理

服务本质就是进程&#xff0c;但是在后台运行&#xff0c;通常会监听某个端口&#xff0c;等等其他的程序来访问 systemctl 管理指令 systemctl [start | stop | restart | reload | status ] systemctl status NetworkManagersystemctl 服务是在/usr/lib/systemd/system 查看 …

在Ubuntu20.04上安装ROS Noetic

本章教程,主要记录在Ubuntu20.04上安装ROS Noetic。 一、添加软件源 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list二、设置秘钥 …

Linux 库制作与原理

文章目录 1. 库的概念2. 静态库2.1 静态库的制作2.2 静态库的原理 3. 动态库的制作4.ELF文件4.1 ELF文件内容4.2 ELF文件链接与加载 5. ELF与进程地址空间&#xff0c;动静态链接和库5.1 ELF与静态链接5.2 ELF与进程地址空间5.3 ELF与动态链接、动态库5.3.2 动态库5.3.2 动态链…

26考研——文件管理_文件目录(4)

408答疑 文章目录 二、文件目录1、目录的作用与结构1.1、目录的基本概念1.2、目录的组织形式1.2.1、单级目录结构1.2.2、两级目录结构1.2.3、多级&#xff08;树形&#xff09;目录结构1.2.4、无环图目录结构 1.3、目录的实现方式1.3.1、线性列表1.3.2、哈希表 2、文件共享与链…

俄军操作系统 Astra Linux 安装教程

安装 U盘制作 Rufus 写盘工具&#xff1a;https://rufus.ie/ Astra Linux ISO 镜像文件&#xff1a;https://dl.astralinux.ru/astra/stable/2.12_x86-64/iso/ 准备一个8g以上的u盘&#xff0c;打开Rufus写盘工具&#xff0c;选择下载的iso镜像&#xff0c;写入u盘&#xff…

MacOS安装Docker Desktop并汉化

1. 安装Docker Desktop 到Docker Desktop For Mac下载对应系统的Docker Desktop 安装包&#xff0c;下载后安装&#xff0c;没有账号需要注册&#xff0c;然后登陆即可。 2. 汉化 前往汉化包下载链接下载对应系统的.asar文件 然后将安装好的文件覆盖原先的文件app.asar文件…

AI 的早期萌芽?用 Swift 演绎约翰·康威的「生命游戏」

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 你有没有想过&#xff0c;能不能通过简单的规则模拟出生与死亡&#xff1f;「生命游戏」正是这样一种充满魅力的数学模拟系统。这篇文章我们来聊聊它的规则到底有多神奇&#xff0c;并用 S…

系统设计——系统架构分层设计经验

摘要 文章通过对 MVC 三层架构和 DDD 四层架构的深入分析&#xff0c;结合具体的代码示例和项目结构设计&#xff0c;为 Java 开发人员提供了全面的系统架构分层设计经验。在实际项目中&#xff0c;开发人员应根据项目的规模和业务复杂度选择合适的架构模式&#xff0c;并遵循…

Windows下编译zlib

本文记录在Windows下编译zlib的流程。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、编译 1.1 下载代码 git clone https://github.com/madler/zlib.git 1.2 构建 按照下表配置CMake&#xff0c; CMake…

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版

1.题目描述 2.思路 方法一&#xff1a; 定义其实坐标&#xff0c;右上角的元素&#xff08;0&#xff0c;n-1&#xff09;。进入while循环&#xff08;注意边界条件&#xff0c;行数小于m&#xff0c;列数要&#xff1e;0&#xff09;从右上角开始开始向左遍历&#xff08;比当…

域权限维持和后渗透密码收集

前言 本文仅用于网络安全领域的教育和研究目的&#xff0c;旨在帮助安全研究人员和渗透测试人员了解和防范黄金票据攻击与白银票据攻击。所有技术的使用必须在合法授权的环境下进行&#xff0c;未经授权的攻击行为是违法的。本文的目标是提高网络安全防护能力&#xff0c;帮助企…