Apache Doris 与 StarRocks
问题
Apache Doris 和 StarRocks 是什么?它们和 ClickHouse 有什么区别?
答案
概述
Apache Doris(原百度 Palo)和 StarRocks(原 DorisDB)都是 MPP 架构的实时分析数据库,以简单运维和高性能分析著称。
历史关系
StarRocks 最初 fork 自 Doris,后独立发展。两者架构相似但实现细节和功能侧重有所不同。
架构对比
| 组件 | 职责 |
|---|---|
| FE(Frontend) | SQL 解析、查询规划、元数据管理 |
| BE(Backend) | 数据存储、查询执行 |
数据模型
| 模型 | 适用场景 | 说明 |
|---|---|---|
| 明细模型 | 原始日志、事件流 | 保留所有明细数据 |
| 聚合模型 | 预聚合指标 | 导入时自动聚合(SUM/MAX/MIN) |
| 主键模型 | 实时更新 | 支持 Upsert,替换旧数据 |
-- 主键模型:支持实时更新
CREATE TABLE user_profile (
user_id BIGINT,
user_name VARCHAR(100),
city VARCHAR(50),
last_active DATETIME
)
PRIMARY KEY (user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 16;
-- 聚合模型:导入时自动聚合
CREATE TABLE daily_metrics (
dt DATE,
channel VARCHAR(50),
pv BIGINT SUM, -- 自动求和
uv BITMAP BITMAP_UNION -- Bitmap 去重
)
AGGREGATE KEY (dt, channel)
DISTRIBUTED BY HASH(dt) BUCKETS 8;
Doris vs StarRocks
| 维度 | Apache Doris | StarRocks |
|---|---|---|
| 开源协议 | Apache 2.0 | Elastic License 2.0(StarRocks 3.x) |
| 社区 | Apache 基金会 | 独立商业公司 |
| 存算分离 | 3.0 开始支持 | 较早支持 |
| 物化视图 | 基础支持 | 更丰富(异步刷新) |
| 数据湖分析 | Multi-Catalog | 外表 + Catalog |
| 运维难度 | ⭐ 低 | ⭐ 低 |
| 兼容性 | MySQL 协议 | MySQL 协议 |
核心优势
为什么选择 Doris/StarRocks
- 极简运维:只有 FE + BE 两类节点,不依赖 HDFS/ZooKeeper
- MySQL 协议兼容:现有 BI 工具、MySQL 客户端直接连接
- 实时导入:支持 Kafka 实时写入、Stream Load
- 物化视图:自动加速高频查询
数据导入方式
-- Stream Load(HTTP 推送,最常用)
curl --location-trusted \
-u user:password \
-H "format: json" \
-T data.json \
http://fe_host:8030/api/db/table/_stream_load
-- Routine Load(Kafka 持续消费)
CREATE ROUTINE LOAD db.job_name ON table_name
COLUMNS(user_id, event_name, event_time)
FROM KAFKA (
"kafka_broker_list" = "broker1:9092",
"kafka_topic" = "events"
);
-- 典型查询(兼容 MySQL 语法)
SELECT
DATE_FORMAT(event_time, '%Y-%m-%d') AS dt,
COUNT(DISTINCT user_id) AS uv,
COUNT(*) AS pv
FROM events
WHERE event_time >= '2024-01-01'
GROUP BY dt
ORDER BY dt;
常见面试问题
Q1: Doris/StarRocks 和 ClickHouse 怎么选?
答案:
| 场景 | 推荐 |
|---|---|
| 运维能力有限 | Doris/StarRocks |
| 极致单表聚合性能 | ClickHouse |
| 需要 MySQL 兼容 | Doris/StarRocks |
| 需要实时更新 | Doris/StarRocks(主键模型) |
| 复杂 JOIN 查询 | Doris/StarRocks(MPP 更优) |
Q2: 如何保证实时数据导入的稳定性?
答案:
- 使用 Routine Load 对接 Kafka,自动重试
- 监控 FE 任务状态,设置告警
- 控制批次大小,避免 BE 内存溢出
- 设置合理的
max_filter_ratio(允许部分脏数据跳过)
Q3: 什么是物化视图加速?
答案: 物化视图将高频查询的聚合结果预计算并持久化存储,查询时自动命中物化视图而非原始表,大幅提升查询速度。详见物化视图。
相关链接
- ClickHouse - 对比方案
- 列式存储原理 - 底层存储原理
- OLAP 引擎选型 - 综合对比