当前位置: 首页 > news >正文

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

目录

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.xdnf.cn/news/747505.html

相关文章:

  • python分配方案数 2023年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析
  • VLAN的作用和原理
  • 命令行式本地与服务器互传文件
  • python:在 PyMOL 中如何查看和使用内置示例文件?
  • MySQL存储架构深度解析:从引擎选型到云原生实践(2025最新版)
  • 【系统配置与部署类】docker的深度配置和应用
  • 5G 网络中的双向认证机制解析
  • 跟单业务和量化交易业务所涉及到的设计模式
  • CP2K 软件介绍与使用指南
  • 34、请求处理-【源码分析】-Model、Map原理
  • MySQL访问控制与账号管理:原理、技术与最佳实践
  • switch-case判断
  • 【PostgreSQL 02】PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来
  • 若依框架定制化服务搭建
  • 开源是什么?我们为什么要开源?
  • gtsam正确的安装姿势
  • 每日八股文5.31
  • Windows上用FFmpeg推流及拉流的流程概览
  • 操作系统学习(八)——同步
  • 【python深度学习】Day 41 简单CNN
  • STM32F103通过Zigbee实现多分用户向主用户发送信息
  • LeetCode Hot100 (贪心)
  • VS Code / Cursor 将默认终端设置为 CMD 完整指南
  • 算法打卡12天
  • Leetcode LCR 187. 破冰游戏
  • cuda_fp8.h错误
  • Python 中Vector类的格式化实现,重点拆解其超球面坐标系的设计精髓
  • C# 面向对象特性
  • 吉林第三届全国龙舟邀请赛(大安站)激情开赛
  • 打卡day41