什么是 Doris 的 Multi-Catalog(多数据源联邦查询)能力?它是如何实现对外部数据湖(如 Apache Paimon、Apache Iceberg、Hive、Elasticsearch)的极速外表分析的?
Apache Doris 的 Multi-Catalog(多数据源联邦查询)能力,是其旨在构建“极速统一分析数据库”的核心特性之一。
简单来说,Multi-Catalog 允许用户无需将数据导入 Doris,即可在 Doris 中通过标准的 SQL 语句直接查询存储在外部系统(如 Hive、Iceberg、Paimon、Elasticsearch、MySQL 等)中的数据,并能实现跨源联合查询(Federated Query)。
下面为您详细拆解它的概念、核心架构,以及它是如何实现对外部数据湖“极速”分析的。
一、 什么是 Multi-Catalog 机制?
在 Doris 1.2 版本之前,查询外部数据需要创建复杂的“外表(External Table)”,管理繁琐。
从 1.2 版本开始,Doris 引入了 Multi-Catalog 架构(2.0 及 3.0 版本进一步极大强化)。它将数据源的管理抽象为三层:
- Internal Catalog:Doris 默认的 Catalog,存储 Doris 自身的高性能列存表(Duplicate/Unique/Aggregate 模型)。
- External Catalog:外部 Catalog。用户只需通过一行
CREATE CATALOG命令,Doris 就会自动同步外部数据源的元数据(Schema)。- 例如: 创建一个 Hive Catalog 后,Doris 会自动感知 Hive 中所有的库和表,用户可以直接用
SELECT * FROM hive_catalog.db.table进行查询。
- 例如: 创建一个 Hive Catalog 后,Doris 会自动感知 Hive 中所有的库和表,用户可以直接用
目前支持的外部数据源包括:
- 数据湖:Apache Hive、Apache Iceberg、Apache Hudi、Apache Paimon、Delta Lake。
- 关系型数据库:MySQL、Oracle、PostgreSQL、SQL Server(通过 JDBC)。
- NoSQL & 搜索:Elasticsearch。
- 对象存储:AWS S3、HDFS、阿里云 OSS、腾讯云 COS 等。
二、 如何实现对外部数据湖的“极速”分析?
传统联邦查询引擎(如 Presto/Trino、Spark SQL)虽然也能查外表,但 Doris 在外表分析上实现了堪比内表的极速性能(在很多场景下,Doris 查外表的性能是 Trino 的 3-5 倍以上)。
这得益于 Doris 在 引擎设计、I/O 优化、执行计划、元数据缓存 等方面的深厚积累:
1. 纯 C++ 向量化执行引擎(Vectorized Engine)
- 痛点:Trino/Spark 是基于 Java 开发的,在大规模数据扫描时,JVM 的垃圾回收(GC)和对象开销会成为瓶颈。
- Doris 的优势:Doris 的 Backend(BE)是用 C++ 编写的。它实现了完全的向量化查询执行,利用 CPU 的 SIMD(单指令多数据)指令集进行并行计算。在处理从外部数据湖拉取上来的海量数据时,Doris 的数据处理吞吐量远超 Java 引擎。
2. 高性能 C++ Native Reader(原生列式读取器)
Doris 抛弃了通过 Java API(如 HDFS Java Client)读取数据湖文件的传统方式,在 C++ 层重写了针对 Parquet 和 ORC 格式的解析器。
- 零拷贝(Zero-Copy):数据直接从文件系统读取到 C++ 的向量化 Block 中,避免了 JVM 和 C++ 之间的内存拷贝开销。
- 多线程并发 I/O:充分利用多核 CPU,并发发起 I/O 请求,极大提升了吞吐。
3. 智能下推(Pushdown)与算子剪枝
为了减少从底层存储(如 HDFS/S3)传输的数据量,Doris 将计算尽可能逼近存储层:
- 分区剪枝(Partition Pruning):通过 SQL 中的过滤条件,直接过滤掉无需读取的 HDFS 路径。
- 列投影下推(Projection Pushdown):只读取 SQL 中需要的列,Parquet/ORC 是列存,这样可以减少 80% 以上的 I/O。
- 谓词下推(Predicate Pushdown):将
WHERE条件下推到 Parquet 的 Row Group 级别。如果 Row Group 的 Min/Max 索引不满足条件,则直接跳过整个数据块。 - 针对 Elasticsearch 的特殊下推:将 SQL 中的过滤、聚合(Min/Max/Count)直接翻译成 ES 的 Query DSL 下推给 ES 集群执行,只把最终的少量结果返回给 Doris。
4. 高效的元数据缓存(Meta Cache)
查询外表慢,往往慢在“获取文件列表(File Listing)”和“解析文件 Footers”上。Doris 建立了三级缓存机制:
- Meta Cache:缓存 Hive Metastore (HMS) 或 Iceberg/Paimon Catalog 中的表结构和分区信息。
- File Cache:缓存 HDFS/S3 上的文件列表(File List)和 Block 位置信息。
- File Footer Cache:缓存 Parquet/ORC 文件的 Footer(元数据),避免每次查询都去读文件的尾部。
- 效果:第二次查询外表时,元数据耗时几乎为 0,直接进入数据读取阶段。
5. 针对现代数据湖(Iceberg / Paimon)的深度优化
Iceberg 和 Paimon 支持 ACID 和行级更新(Merge-on-Read / Copy-on-Write),读取它们需要处理复杂的“Delete Files(删除文件)”。
- Doris 的 C++ Reader 深度集成了 Iceberg 的 Position Delete 和 Equality Delete 机制。
- 对于 Paimon,Doris 支持其 Primary Key 格式 的高效读取,并在 C++ 层进行高效的 Delete Vector 合并,从而保证了即使在频繁更新的数据湖上,依然能保持极高的查询速度。
6. 现代 CBO 优化器(Nereids)
Doris 2.0 引入了全新的 Nereids 优化器,它能够对跨 Catalog 的复杂 Join 进行智能优化:
- Join Reorder:自动调整内表与外表、外表与外表之间的 Join 顺序。
- Distributed Join Selection:根据外表数据量的大小,自动选择 Broadcast Join 还是 Shuffle Join,甚至将大表留在原地,小表广播。
三、 典型应用场景
- 湖仓一体(Lakehouse)统一查询门户:
不用再部署 Trino。一个 Doris 既能做高性能内表分析,又能作为全公司数据湖(Hive/Iceberg)的统一查询入口。 - 冷热数据分层与联邦分析:
- 热数据:存放在 Doris 内部(性能最高,成本较高)。
- 冷数据:归档到数据湖中(Parquet/ORC 格式存在 HDFS/S3,成本极低)。
- 查询:通过一个 SQL,直接将 Doris 内表与外部冷数据进行
UNION ALL或JOIN,对用户完全透明。
- 极速数据写入(ETL/ELT):
利用INSERT INTO doris_internal_table SELECT ... FROM external_catalog.db.table,将数据湖中的数据极速清洗并导入到 Doris 中,替代 Spark 等繁重的 ETL 工具。
总结
Doris 的 Multi-Catalog 不仅仅是一个“能连外表”的连接器,而是一个将 Doris 的 C++ 向量化执行引擎、现代 CBO 优化器直接赋能于外部数据湖的“加速器”。它让用户在享受数据湖低成本、开放性优势的同时,获得了媲美企业级 MPP 数据库的极致查询体验。