OLAP 选型对比:Doris vs ClickHouse vs Hive

在大数据分析领域,Hive、ClickHouse、Apache Doris 是三个绕不开的名字,但它们解决的问题并不完全相同。选错了技术栈,轻则查询慢几十倍,重则整个数仓架构推倒重来。

本文从架构原理出发,逐一剖析三者的设计哲学,再在性能、并发、运维、成本、适用场景等维度做横向对比,最后给出不同业务场景下的选型建议。

一、三者的定位与诞生背景

Hive:离线数仓的奠基者

Hive 诞生于 2008 年的 Facebook,核心思路是:把 SQL 翻译成 MapReduce/Tez/Spark 任务,跑在 HDFS 上。它解决的是"如何用熟悉的 SQL 语法操作海量数据"的问题,而不是"如何快速查询"。

flowchart TD
    A["用户 SQL"]
    B["Hive 编译器 生成执行计划"]
    C["MapReduce / Tez / Spark 任务"]
    D["HDFS 数据读取 → 计算 → 结果输出"]
    A --> B --> C --> D

Hive 的设计是为批处理吞吐量优化的,单个查询可以处理 PB 级数据,但延迟通常在分钟到小时级别,根本原因是 MapReduce 的任务启动开销和磁盘 I/O 极重。

ClickHouse:单机极致性能的列存引擎

ClickHouse 诞生于 2016 年的 Yandex(俄罗斯版 Google),为Yandex.Metrica 网站分析场景量身打造。核心设计哲学是:在单台机器上把列存 + 向量化执行做到极致,让一台服务器的性能超过竞品的整个集群

flowchart LR
    Q["查询"] --> M["MergeTree 列存引擎"]
    M --> V["向量化执行 SIMD"]
    V --> R["结果"]
    NOTE["数据按列存储 每列独立压缩\n稀疏索引 每8192行一个索引点"] -. "支撑" .-> M

ClickHouse 的优势是单查极快,在宽表聚合场景下性能常常是同类产品的 5-10 倍。但它的并发能力相对弱——大查询会占满 CPU,并发超过几十个查询时性能急剧下降。

Apache Doris:为高并发实时分析而生

Apache Doris(原百度 Palo,2018 年开源)的设计目标是:在保持接近 ClickHouse 查询速度的同时,支持高并发、数据实时可见、兼容 MySQL 协议

graph TD
    FE["FE Frontend\nSQL 解析 / 查询规划 / 元数据"]
    BE1["BE Backend 1\n列存 + 索引\n向量化执行"]
    BE2["BE Backend 2\n列存 + 索引\n向量化执行"]
    BE3["BE Backend 3\n列存 + 索引\n向量化执行"]
    FE -->|"查询下发"| BE1
    FE -->|"查询下发"| BE2
    FE -->|"查询下发"| BE3

Doris 采用 FE/BE 分离架构:FE 负责 SQL 解析和查询计划,BE 负责存储和计算。数据在 BE 之间按 Tablet 分片存储,多副本保证高可用。

Doris 的关键差异化特性:

  • Unique Key 模型:支持基于主键的 Upsert(更新插入),解决了 ClickHouse 数据修改困难的问题
  • 实时导入:Stream Load / Routine Load 支持秒级数据可见
  • 行列混存(1.2+):Unique Key 模型支持行存,点查性能媲美 MySQL
  • MySQL 协议兼容:现有 MySQL 客户端、BI 工具直接连接,零改造

二、架构深度对比

存储模型

维度HiveClickHouseDoris
存储格式ORC / Parquet(外部文件)MergeTree(自研列存)Segment(自研列存)
存储位置HDFS / 对象存储本地磁盘本地磁盘(支持冷热分层到 S3)
数据更新不支持(覆盖分区)有限支持(ReplacingMergeTree,异步合并)原生支持(Unique Key Upsert)
索引分区裁剪稀疏主键索引 + 跳数索引前缀索引 + ZoneMap + Bloom Filter
压缩Snappy / ZSTDLZ4 / ZSTD(列级独立压缩)LZ4 / ZSTD

查询执行引擎

维度HiveClickHouseDoris
执行模型MapReduce / Tez / Spark(磁盘)向量化(内存,Pipeline)向量化(内存,Pipeline,1.2+)
JOIN 策略Sort-Merge / Broadcast(依赖执行引擎)Hash Join(右表需全量内存)Hash Join + Colocate Join(同分桶免 Shuffle)
物化视图不原生支持支持(Materialized View)支持(同步/异步物化视图)
查询延迟分钟级毫秒~秒级毫秒~秒级

数据导入

方式HiveClickHouseDoris
批量导入LOAD DATA / INSERT INTO SELECTclickhouse-client / INSERTBroker Load / INSERT INTO SELECT
实时流式不支持(需外部工具写 HDFS)Kafka Engine(实验性)Routine Load(Kafka 消费,稳定)
HTTP 导入不支持HTTP InterfaceStream Load(推荐,原子性强)
实时可见延迟小时级(分区粒度)秒级(Insert 后即可见)秒级(提交即可见)
Flink 连接器Flink-Hive Catalog(成熟)flink-connector-clickhouse(社区)Flink Doris Connector(官方维护)

三、性能横向对比

业界 Benchmark 数据(SSB / TPC-H)

以 SSB(Star Schema Benchmark)100GB 数据集为参考:

查询延迟(毫秒,越低越好):

ClickHouse:   ████░░░░░░  ~200ms   ← 单查最快
Doris:        ██████░░░░  ~350ms   ← 接近 ClickHouse
Hive(Tez):    ██████████  ~30000ms ← 慢 100x+

ClickHouse 在单表宽表聚合场景下通常比 Doris 快 30-50%,主要原因是 ClickHouse 的向量化引擎发展更早、优化更深,以及稀疏索引粒度(8192 行)比 Doris 的索引更轻量。

并发能力对比

并发 QPS(相同硬件,简单聚合查询):

Doris:        ██████████  ~1000 QPS  ← 高并发场景首选
ClickHouse:   ████░░░░░░  ~100 QPS   ← 并发受限于 CPU 占用
Hive:         █░░░░░░░░░  ~10 QPS    ← 任务调度开销大

Doris 并发能力远超 ClickHouse 的根本原因:

  1. 资源隔离:Doris 支持 Workload Group,不同查询分组限制 CPU/内存
  2. 缓存机制:Partition Cache / SQL Cache 大幅降低重复查询开销
  3. 短路执行:Unique Key 模型的点查走行存,不需要列解压,极快

存储压缩比

原始数据 100GB 压缩后(列存 + ZSTD):

ClickHouse:   ~15GB   (压缩比约 6.5x,列存 + 列级独立压缩)
Doris:        ~18GB   (压缩比约 5.5x)
Hive(ORC):    ~20GB   (压缩比约 5x)

ClickHouse 压缩比略优于 Doris,因为其列级独立压缩算法选择更激进(不同列可以选不同编码方式)。

四、运维复杂度对比

集群依赖

组件HiveClickHouseDoris
必须依赖HDFS + YARN + Metastore无(ZooKeeper 用于副本同步,可选)无(自带元数据管理)
HA 方案依赖 HDFS HA + YARN HAZooKeeper + 副本表FE 多主 + BE 多副本(内置)
扩容方式增加 DataNode,Hive 自动感知手动 Reshard(数据迁移复杂)在线扩容,自动均衡(Tablet 迁移)
运维复杂度高(多组件联动)中(单进程简单,但扩容麻烦)中(FE/BE 二进制,但调优参数多)

SQL 兼容性

特性HiveClickHouseDoris
SQL 方言HiveQL(与标准 SQL 有差异)ClickHouse SQL(部分不兼容)MySQL 语法(高度兼容)
JDBC 连接HiveServer2 JDBCclickhouse-jdbcMySQL JDBC(直接复用)
BI 工具接入需要适配 Hive 驱动需要适配 ClickHouse 驱动选 MySQL 驱动即可
子查询支持有限(HQL 限制)支持但性能差异大完整支持(优化器较好)

Doris 兼容 MySQL 协议这一点在工程实践中价值巨大——现有的 BI 工具(Superset、Grafana、Tableau)、数据库管理工具(DBeaver、Navicat)、ORM 框架全部可以零改造接入。

五、适用场景深度对比

场景一:实时 BI 报表(高并发点查)

需求:百人团队同时查看各自负责的业务看板,QPS 峰值 500+,
      数据需要 T+0(当天数据当天可查),部分指标需 5 分钟内可见。

推荐:Doris ✓✓✓   ClickHouse ✓✓   Hive ✗

原因:
- Doris Routine Load 消费 Kafka,5 分钟内数据可见
- Doris 高并发 QPS 可达 1000+,轻松支撑多人同时查询
- Doris MySQL 兼容,BI 工具接入无缝
- ClickHouse 并发受限,500 QPS 下 CPU 打满,查询超时率高
- Hive 延迟小时级,T+0 无法实现

场景二:离线大规模 ETL(PB 级数据处理)

需求:每天凌晨处理 10TB 原始日志,经过多层 JOIN 和聚合,
      生成 DWD/DWS 层数据,写入下游。

推荐:Hive(Spark) ✓✓✓   Doris ✓   ClickHouse ✗

原因:
- Hive+Spark 生态成熟,支持 PB 级数据处理
- Spark 的内存管理和 Shuffle 优化专为大 ETL 设计
- Doris 不擅长超大规模 ETL,JOIN 时内存压力大
- ClickHouse 的分布式 JOIN 实现较弱,PB 级场景容易 OOM

场景三:用户画像(标签圈人)

需求:2 亿用户,每人 500+ 标签,运营人员按标签组合圈人,
      要求 10 秒内返回圈人结果,每天数据更新一次。

推荐:Doris ✓✓✓   ClickHouse ✓✓   Hive ✗

原因:
- Doris Aggregate 模型天然支持标签的位图(Bitmap)聚合
- Doris 的 BITMAP_UNION、INTERSECT_COUNT 等函数专为圈人优化
- Doris 支持数据每日 Upsert 更新标签,ClickHouse 更新困难
- ClickHouse 也有 Bitmap 函数,但数据更新只能通过 Replace 表,维护成本高

场景四:日志分析(时序数据,写多读少)

需求:每秒百万条日志写入,按时间范围 + 关键字查询,
      数据保留 30 天,查询 SLA 5 秒以内。

推荐:ClickHouse ✓✓✓   Doris ✓✓   Hive ✗

原因:
- ClickHouse MergeTree 的时序写入性能极高(顺序写)
- ClickHouse 列存对时序数据压缩率极高(同一列值相近,LZ4 压缩效果好)
- ClickHouse 的 Token Bloom Filter 支持字符串关键字过滤
- Doris 在日志写入吞吐量上略逊于 ClickHouse(Tablet 元数据管理有开销)

场景五:企业级数据仓库(ODS→DWD→DWS→ADS)

需求:搭建完整数仓,ODS 层接原始数据,DWD 清洗,
      DWS 聚合,ADS 层服务查询,兼顾批处理和实时。

推荐:Hive(ODS/DWD) + Doris(DWS/ADS) 混合架构

原因:
- ODS/DWD 层数据量大、以 ETL 为主 → Hive + Spark
- DWS/ADS 层数据量小、查询频繁 → Doris(实时导入 + 高并发查询)
- Doris 的 Hive Catalog 特性可以直接查询 Hive 表,两侧打通
- 这是目前国内大厂最常见的数仓架构组合

六、选型决策树

flowchart TD
    Q1{"数据规模是否 PB 级\n以离线 ETL 为主?"}
    Q2{"需要数据实时可见\n秒级?"}
    Q3{"并发 QPS 是否 > 100?"}
    Q4{"查询是否以单表宽表\n聚合为主 无复杂 JOIN?"}
    R1["Hive + Spark"]
    R2["Doris"]
    R3["ClickHouse 或 Doris 均可"]
    R4["ClickHouse 性能最极致"]
    R5["Doris SQL 兼容性更好 JOIN 优化更强"]

    Q1 -->|是| R1
    Q1 -->|否| Q2
    Q2 -->|是| Q3
    Q2 -->|否| Q4
    Q3 -->|是| R2
    Q3 -->|否| R3
    Q4 -->|是| R4
    Q4 -->|否| R5

一句话总结

系统一句话定位杀手级场景
Hive海量数据的批处理流水线PB 级离线 ETL、数仓 ODS/DWD 层
ClickHouse单台机器的极致查询性能日志分析、单表宽表聚合、低并发高吞吐分析
Doris高并发实时分析的全能选手实时报表、用户画像、数仓 DWS/ADS 层

七、关键点总结

  • Hive 本质是 SQL-on-Hadoop,延迟高(分钟级)但吞吐量大,适合离线批处理;数据存在 HDFS,不锁定计算引擎,可随时切换 Tez/Spark
  • ClickHouse 的核心优势是单查极快,列存 + SIMD 向量化是其底气;但并发能力弱(大查询占满 CPU),数据更新麻烦(ReplacingMergeTree 异步合并,读时去重)
  • Doris 的核心优势是高并发 + 实时可见 + MySQL 兼容;Unique Key 模型原生支持 Upsert;FE/BE 架构无外部依赖,运维比 Hive 简单得多
  • 三者并非互斥,实际生产中最常见的是 Hive(离线层)+ Doris(实时服务层) 的组合,通过 Doris 的 Hive Catalog 打通查询
  • 如果业务以日志/时序数据写入为主,查询并发不高,ClickHouse 是更合适的选择,其写入吞吐和压缩比都优于 Doris
  • 如果团队 MySQL 背景强、BI 工具已有大量 MySQL 连接,Doris 的零改造接入优势明显
  • Doris 2.0+ 引入了存算分离架构(对接 S3),正在补齐对象存储场景的短板,与 ClickHouse 的差距在持续缩小