Apache Doris 深入
概述
Apache Doris 是国产开源 MPP(Massively Parallel Processing)OLAP 数据库,以高并发与多表 Join 见长,被广泛用于报表、即席查询与实时数仓。本文讲清 MPP 架构、分区分桶、Rollup、Colocation Join、物化视图与查询优化。
一、Doris 定位
| 特性 | 说明 |
|---|---|
| 类型 | MPP OLAP |
| 架构 | FE + BE |
| 特点 | 高并发、强 Join |
| 数据模型 | 明细/聚合/唯一/主键 |
| 适用 | 报表、实时数仓、大屏 |
| 对比 ClickHouse | 说明 |
|---|---|
| CH 强聚合单表 | Doris 强多表 Join |
| CH 单机快 | Doris 分布式均衡 |
二、MPP 架构
2.1 组件
FE(Frontend,前端)
├── 元数据管理
├── SQL 解析/优化/规划
└── 查询调度
BE(Backend,后端)
├── 数据存储
└── 查询执行(MPP 节点)2.2 查询流程
1. 客户端 → FE(SQL 优化)
2. FE 生成分布式执行计划
3. 调度到多 BE 并行执行
4. 结果汇聚返回| MPP 特点 | 说明 |
|---|---|
| 并行 | 多 BE 同时算 |
| 数据本地 | 就近计算 |
| 扩展 | BE 扩容提升吞吐 |
三、数据模型
| 模型 | 特点 | 适用 |
|---|---|---|
| 明细(Duplicate) | 全保留 | 明细查询 |
| 聚合(Aggregate) | 预聚合 | 汇总指标 |
| 唯一(Unique) | 主键唯一 | 最新状态 |
| 主键(Primary) | 更新强 | 实时更新 |
sql
-- 聚合模型
CREATE TABLE order_agg (
order_date DATE,
city VARCHAR(20),
gmv DECIMAL(12,2) SUM,
cnt BIGINT SUM
) ENGINE=OLAP
AGGREGATE KEY(order_date, city)
DISTRIBUTED BY HASH(city) BUCKETS 8;| 列类型 | 说明 |
|---|---|
| Key 列 | 维度(聚合键) |
| Value 列 | 指标(聚合方式) |
四、分区与分桶
4.1 分区(Partition)
逻辑分区:按时间等(管理/裁剪)sql
PARTITION BY RANGE(order_date) (...);| 作用 | 说明 |
|---|---|
| 裁剪 | 跳过无关分区 |
| 管理 | 分区级操作 |
| 建议 | 按天/月 |
4.2 分桶(Bucket)
物理分桶:数据分布(HASH)sql
DISTRIBUTED BY HASH(city) BUCKETS 8;| 作用 | 说明 |
|---|---|
| 并行 | 桶间并行 |
| 本地性 | Join 匹配 |
| 建议 | 数据量决定桶数 |
4.3 设计要点
| 要点 | 说明 |
|---|---|
| 分区粒度 | 与查询频率匹配 |
| 分桶键 | 高基数列 |
| 桶数 | 不宜过小(并行低) |
五、Rollup 预聚合
5.1 作用
对聚合模型建多维度上卷:
查询命中 Rollup → 走预聚合sql
ALTER TABLE order_agg
ADD ROLLUP r_city (order_date, city, gmv, cnt);| Rollup | 维度 |
|---|---|
| 原表 | (date, city) |
| r_date | (date) |
| r_city | (city) |
5.2 命中规则
查询维度是某 Rollup 前缀 → 命中
自动选择最优 Rollup| 优势 | 说明 |
|---|---|
| 查询快 | 少聚合 |
| 自动 | 优化器选择 |
六、Colocation Join
6.1 问题
大表 Join:
数据分散 → 跨 BE 数据搬迁 → 慢6.2 Colocation 原理
分桶键一致的表放同一 BE 组:
Join 同桶数据本地进行
避免网络搬迁sql
PROPERTIES ("colocate_with" = "group1");| 条件 | 说明 |
|---|---|
| 分桶键相同 | 同 key 分桶 |
| 桶数相同 | 一致 |
| 副本一致 | 同分布 |
| 优势 | 说明 |
|---|---|
| Join 快 | 本地化 |
| 稳定 | 无搬迁 |
七、物化视图
7.1 作用
预计算聚合结果,查询自动命中:
加速常用聚合sql
CREATE MATERIALIZED VIEW mv_city_uv AS
SELECT order_date, city, uniq(user_id) AS uv
FROM events GROUP BY order_date, city;| 特性 | 说明 |
|---|---|
| 自动维护 | 数据更新同步 |
| 自动命中 | 优化器选择 |
| 多维度 | 可建多个 |
7.2 与 Rollup 区别
| 对比 | Rollup | 物化视图 |
|---|---|---|
| 范围 | 聚合模型 | 通用 |
| 表达式 | 简单聚合 | SQL 查询 |
| 灵活 | 低 | 高 |
八、查询优化
8.1 优化器
CBO(成本优化):
统计信息 → 选择最优计划
谓词下推、Join 重排8.2 常用手段
| 手段 | 说明 |
|---|---|
| 分区/分桶裁剪 | 减少扫描 |
| Colocation | Join 本地化 |
| 物化视图 | 预聚合 |
| 向量化 | 批量执行 |
| Runtime Filter | 运行时过滤 |
| 并行 | 调整并行度 |
8.3 参数
| 参数 | 说明 |
|---|---|
| max_parallel_scan_instance_num | 扫描并行 |
| parallel_fragment_exec_instance_num | 执行并行 |
| enable_vectorized_engine | 向量化 |
九、实时数仓配合
Flink → Doris(实时写入)
明细/聚合表模型 + 主键更新
报表/大屏秒级查询| 场景 | Doris 角色 |
|---|---|
| 实时报表 | 结果存储 |
| 即席分析 | 查询引擎 |
| 大屏 | 高并发 |
常见问题速查
| 问题 | 原因与处理 |
|---|---|
| Join 慢 | Colocation/广播 |
| 查询扫描大 | 分区裁剪/物化视图 |
| 写入慢 | 批量 + 模型 |
| 副本不均衡 | 检查分桶与分布 |
| 高并发慢 | 扩容 BE/缓存 |