StarRocks调研
介绍
StarRocks 是现在比较流行的MPP数据库,在数据分析场景中非常有优势。
基本架构
- FE:负责管理元数据,管理客户端连接,进行查询规划,查询调度
- BE:负责数据存储和SQL执行
- tablet: 是数据存储的基本单位,可以理解为一个data block
表设计
列式存储
- 维度列:就是key列,用于分组和排序
- 指标列:value列,用于执行聚合函数
一行数据的所有列在各自的列数组中保持对齐,按照维度列做多重排序
表模型
- 明细模型: 表中存在主键重复的数据行, 和摄入数据行一一对应, 用户可以召回所摄入的全部历史数据。
- 聚合模型: 表中不存在主键重复的数据行, 摄入的主键重复的数据行合并为一行, 这些数据行的指标列通过聚合函数合并, 用户可以召回所摄入的全部历史数据的累积结果, 但无法召回全部历史数据。
- 更新模型&主键模型: 聚合模型的特殊情形, 主键满足唯一性约束, 最近导入的数据行, 替换掉其他主键重复的数据行。相当于在聚合模型中, 为数据表的指标列指定的聚合函数为REPLACE, REPLACE函数返回一组数据中的最新数据。
StarRocks提供的pk模型是相比doris更好的能力,PK模型使得starrocks有接近RDB的读取体验,更像一个实时数仓。
tips: 更新模型是读取时合并,主键模型是写入时合并
数据分布
建表时支持分区、分桶来支持两级的数据分区。支持如下的方式:
- Round-Robin : 以轮转的方式把数据逐个放置在相邻节点上。
- Range : 按区间进行数据分布,图中区间[1-3],[4-6]分别对应不同Range。
- List : 直接基于离散的各个取值做数据分布,性别、省份等数据就满足这种离散的特性。每个离散值会映射到一个节点上,不同的多个取值可能也会映射到相同节点上。
- Hash : 按哈希函数把数据映射到不同节点上。
优化器
优化器是数据库中最核心和组件。starrocks自己实现了一个cascades模式的自顶向下的CBO优化器(主要基于columnbia论文来实现)。主要优点是:
- 针对向量化执行引擎的深度定制
- 公共表达式复用
- 相关子查询重写
- join分布式执行策略选择
- 低基数字典优化
StarRocks整个优化器的执行框架如下
具体以上点如何实现的,可以直接看starrock的FE源码或者SR研发写的源码导读,FE查询引擎包含optimizer的实现。
向量化执行器
向量化执行器的特点:
- 列式数据组织与计算:StarRocks的数据存储、内存中数据的组织方式,以及SQL算子的计算方式(SIMD指令计算),都是列式实现的。按列的数据组织也会更加充分的利用CPU的Cache,按列计算会有更少的虚函数调用以及更少的分支判断从而获得更加充分的CPU指令流水。
- Operation on Encoded Data: 无需解码即可完成算子执行
向量化执行器实现的核心重点:
- 算子的向量化
- 表达式向量化执行
- 存储层向量化
存储层向量化
按照列式存储和读取。向量化的基数数据结构如下:主要是column和chunk的数据结构。一行数据在各个column内的value,一起读取出来变成一个chunk。
算子向量化
关键在于实现算子时多列聚合、join、sort的向量化处理。
表达式向量化执行
这个主要就是表达式计算利用CPU的SIMD进行向量化计算。
功能特性
自动物化视图加速
- 用户可以定义物化视图,SR保证物化视图和源表同步更新
- 新的查询SR在查询规划时会自动匹配合适的物化视图加速查询
- 支持schema change
StarRocks实现的物化视图理念可以参考google mesa的论文。SR的物化视图基本实现和rollup表是一样的,能力上是rollup表的超集。在基表基础上构建rollup表,将基表更新同步更新到rollup表,从而实现物化视图的增量更新。通过rollup表提供的预聚合结果可以加速物化视图的查询。
外表数据湖分析
SR支持mysql、elasticsearch、hive、iceberg和hudi等数据源作为外表读取数据,更好兼容企业已有数据生态,方便做全域数据湖分析。这里starrocks也有一些不错的优化,比如ES支持查询时进行谓词下推,用类SQL的方式进行查询。
分布式join
- Colocate join: 分布式系统实现join数据分布的策略之一,能够减少数据分布在多个节点引起的join时的数据移动和网络传输,从而提高性能。
- Lateral join: 这个能力主要是帮用户string array、数组等做展开使用的。效果如下:
shortkey index加速数据查找
本质构建了一个按行寻址的稀疏索引。整个步骤归纳为:
- 通过维度列key值先查找short key获得数据块的其实行号
- 查找维度列的行号索引获得行关联的目标列数据块位置
- 根据数据块位置读取数据解压解码
列级索引技术
- Bloomfilter可快速判断数据块中不含所查找值,
- ZoneMap通过数据范围快速过滤待查找值,
- Bitmap索引可快速计算出枚举类型的列满足一定条件的行。
动态分区
为新到达的数据创建新分区, 删除过期分区。 StarRocks的动态分区机制可以实现分区rollover。
内存表
支持把表数据全部缓存在内存中用于加速