Doris architecture

ANALYTICAL DATABASE / SOURCE READING / LESSON 21

Lakehouse and federated query

Understand External Catalogs, partition pruning, Data Cache, small-file governance, and when to accelerate lake data inside Doris.

Reading
55 min
Track
Doris architecture
Source
Chinese source notes

The source notes for this track are currently maintained in Chinese.

预计阅读时间: 55 分钟 前置阅读: doc-01, doc-15, doc-18 下一次阅读: doc-22(可观测与半结构化分析)


1. Doris 为什么进入湖仓场景

Doris 最初强项是内表实时分析, 但现代数据平台通常已经有 Hive、Iceberg、Hudi、Paimon、S3/HDFS 对象存储和外部数据库。湖仓场景下, Doris 的角色变成:

统一 SQL 查询入口
  → 外部 Catalog 元数据
    → 远端文件扫描
      → Doris 优化器与执行引擎
        → Data Cache / 物化视图 / 内表加速

它的价值不是替代所有数据湖计算, 而是把交互式分析、BI、实时宽表和外部湖数据放到同一个查询面里。

参考:


2. External Catalog 的心智模型

External Catalog 让 Doris 不复制数据也能访问外部系统。

湖仓与联邦查询——External Catalog、Data Cache 与小文件治理 图 01

关键区别:

类型元数据数据位置典型场景
Internal CatalogDoris FEDoris BE 本地/对象存储高性能主仓
Hive CatalogHive MetastoreHDFS/S3存量离线数仓
Iceberg CatalogIceberg 元数据HDFS/S3表格式湖仓
JDBC Catalog外部 DB外部 DB维表、临时联邦
Doris Catalog另一个 Doris 集群远端 Doris跨集群分析

3. 湖仓查询为什么慢

内表慢查询常见瓶颈是扫描范围、Join、聚合和资源竞争。湖仓外表多了三类问题:

  1. 元数据慢: 分区、文件、Manifest 太多。
  2. 远端 I/O 慢: 对象存储和 HDFS 延迟高于本地盘。
  3. 小文件慢: Split 数过多, FE 规划和 BE 调度成本高。

POC 时如果只跑一次查询, 往往测到的是冷缓存和远端 I/O, 不是 Doris 稳态能力。


4. 分区裁剪先行

湖表必须让分区裁剪生效。

EXPLAIN
SELECT count(*)
FROM iceberg_catalog.db.event_log
WHERE dt = '2026-07-27'
  AND service_name = 'checkout';

看计划中的 partition 信息:

partition=203/1

如果扫描分区远超预期:

  • SQL 条件是否使用了分区列。
  • 分区列是否被函数包裹导致不能裁剪。
  • 外部表分区元数据是否同步。
  • Iceberg/Hive 的分区表达式是否和 SQL 一致。

5. Data Cache

远端存储的 I/O 延迟通常是湖仓查询瓶颈。Data Cache 把外部文件的热数据缓存到 BE 本地磁盘。

适合:

  • BI 看板重复查询同一批湖数据。
  • POC 中需要测稳态查询性能。
  • 热分区远小于湖表总规模。

注意:

  • 第一次查询可能仍然慢。
  • 第二次或预热后才代表热数据性能。
  • 缓存盘容量要和热数据窗口匹配。
  • 对小文件过多的表, Cache 也不能完全抵消规划开销。

POC 做法:

1. 跑一次目标 SQL 预热
2. 跑第二次记录稳态耗时
3. 用 Profile 看 Cache 命中和远端读取量
4. 再对比内表或物化视图方案

6. 小文件治理

小文件问题不是 Doris 独有, 但 Doris 查询湖表时会承受结果:

小文件多
  → Split 多
    → FE 规划压力增加
      → BE Scan Task 变碎
        → 网络和调度开销变大

治理优先级:

  1. 源头合并: Spark/Flink/Iceberg 写入时控制文件大小。
  2. 表格式维护: Iceberg rewrite data files。
  3. Doris 限制: 控制最大 Split 数, 避免 FE OOM。
  4. 热数据落内表: 对高频交互查询做导入或 MV。

经验目标: 湖表文件尽量保持在百 MB 级别, 不要产生大量 KB/MB 级碎文件。


7. 外表 Join 内表

常见模式:

SELECT d.city, count(*)
FROM iceberg_catalog.dw.fact_order o
JOIN internal.dim_user d ON o.user_id = d.user_id
WHERE o.dt = '2026-07-27'
GROUP BY d.city;

风险:

  • 外表扫描大, Join 前过滤不足。
  • 内表维表不小, Broadcast 成本高。
  • 外表统计信息不足, Join 顺序不合理。

处理:

  • 外表先分区裁剪。
  • 小维表可考虑 Dictionary 或 Broadcast。
  • 大表 Join 考虑异步物化视图或把热分区导入内表。
  • 统计信息不准时用 Hint 辅助验证。

8. 什么时候把湖数据导入 Doris 内表

场景建议
偶发探索直接 External Catalog
高频 BI内表或物化视图
最近 N 天热数据热分区导入内表
历史归档低频留在湖表
复杂 Join 固定异步 MV
实时明细分析Doris 内表

一个常见混合架构:

ODS / DWD 长周期数据留在 Iceberg
  → 最近 7/30 天热数据导入 Doris 内表
    → 高频报表用 MV
      → 历史低频查询走 External Catalog

9. Lakehouse Profile 关注点

湖仓 Profile 重点不同:

指标方向说明
Split 数是否被小文件打爆
远端读取字节是否扫了太多数据
MergeIO是否出现读放大
Cache 命中Data Cache 是否生效
Scan 等待远端 I/O 或连接池是否瓶颈
FE 规划耗时元数据和 Split 生成是否过重

专家报告要分清:

  • Doris 执行慢。
  • 外部存储慢。
  • 元数据慢。
  • 文件布局慢。
  • SQL 没有分区裁剪。

一句话总结:

Doris 湖仓专家的能力, 是知道什么时候直接查湖、什么时候缓存、什么时候物化、什么时候导入内表, 而不是把 External Catalog 当成无限性能的魔法入口。