BE 文件写入流程
整体流程如上图,主要涉及rowset的构建,以及最终segment的管理。与mergetree 相似,数据都是写入memtable, 在达到一定条件的时候构建rowset, rowset 主要是管理segment,这里边包含了的信息如下
可以理解为一些统计信息和元数据。
segment的格式如下:
文件头 (File Header):
位于文件的最开始。
包含魔数(用于识别文件类型)、Segment 文件格式版本号和校验和类型等基本信息。
数据区 (Data Region):
紧跟文件头之后,是 Segment 文件中占比最大的部分。
实际存储用户数据,采用列式存储。每一列的数据被组织成一个或多个数据页 (Data Page)。
数据页是读写的基本单元,页内数据会经过编码(如字典编码、RLE)和压缩(如 LZ4, ZSTD)处理。
不同列的数据及其数据页在数据区内按一定顺序排列。
索引区 (Index Region):
位于数据区之后。
存储各种用于加速查询的索引数据,这些索引数据也通常按页(索引页, Index Page)组织。
常见的索引包括:
短键索引 (Short Key Index): 指向数据块的稀疏索引。
布隆过滤器索引 (Bloom Filter Index): 用于快速判断值是否存在。
ZoneMap 索引: 存储数据页/块中列的统计信息(min/max/has_null)。
Ordinal 索引 (行号索引): 隐式或显式存在,用于按行号定位。
可选索引如:位图索引、倒排索引、主键索引。
文件尾 (Segment Footer):
位于整个文件的末尾。
这是一个关键的元数据部分,以 Protocol Buffer 格式序列化存储(即 SegmentFooterPB)。
SegmentFooterPB 包含了对整个 Segment 文件结构的描述,例如:
Segment 中的总行数。
列元数据 (ColumnMetaPB) 列表: 对每一列,详细记录其数据类型、编码、压缩方式,以及指向该列数据区(数据页)的起始偏移和长度、字典页指针、各种列级索引页(如布隆过滤器、ZoneMap)的指针。
指向短键索引页的指针。
其他元信息如校验和、版本等。
Doris BE 读取 Segment 时,会先从文件末尾读取并解析 SegmentFooterPB,从而获得整个 Segment 的“地图”,然后根据需要直接定位到文件中的特定数据或索引部分
本文由 妖言君 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jun 4, 2025 at 07:07 pm