文章目录
- Apache Doris:实时分析数据库,15K Star 的 MPP 查询引擎
- 1、 解决什么问题
- 2、 架构长什么样
- 3、 存储引擎
- 4、 查询引擎
- 5、 兼容性和生态
- 6、 谁在用
Apache Doris:实时分析数据库,15K Star 的 MPP 查询引擎
Apache Doris 在 GitHub 上拿到了 15,519 Star。
这是一个基于 MPP 架构的实时分析型数据库,主打速度快、用起来简单。在海量数据场景下,能做到亚秒级返回查询结果,既能扛高并发的点查,也能跑高吞吐的复杂分析。
1、 解决什么问题
企业做数据分析,通常面对两个场景:实时报表和离线数仓。
传统做法是搞一套实时数仓处理在线数据,再搞一套离线数仓跑批处理,中间还要配各种 ETL 管道把数据搬来搬去。架构复杂,维护成本高,数据口径还不一定对得上。
Doris 的思路是用一套系统覆盖这些场景。报表分析、即席查询、统一数仓、数据湖查询加速,都能用它来搞定。实际业务里拿它做用户行为分析、AB 实验平台、日志检索、用户画像、订单分析的团队不少。
2、 架构长什么样
Doris 的架构只包含两种进程:
- Frontend(FE):负责接收用户请求、解析查询、管理元数据和节点。
- Backend(BE):负责存数据和执行查询。数据按分片存储,多副本分布在 BE 节点上。
生产环境可以部署多个 FE 节点做容灾。FE 分三个角色:Master 负责元数据读写,Follower 负责读元数据并在 Master 挂掉时接替,Observer 只负责读元数据用来提升查询并发。
FE 和 BE 都能水平扩展,单个集群能撑几百台机器、几十 PB 的存储。
3、 存储引擎
Doris 用的是列式存储引擎,按列做编码、压缩和读取。好处是压缩比高,扫描时只读需要的列,IO 和 CPU 利用率都上去了。
索引方面支持几种:排序复合键索引,最多指定三列组成复合排序键,适合高并发报表场景做数据裁剪;Min/Max 索引,数值类型的等值和范围查询能快速过滤;BloomFilter 索引,高基数列的等值过滤效果好;倒排索引,任意字段都能快速检索。
数据模型有三种:明细模型存原始明细数据;主键模型保证 Key 唯一,同 Key 数据覆盖写,支持行级更新;聚合模型同 Key 的值列自动合并,通过预聚合提升查询性能。
还支持单表物化视图(系统自动刷新维护)和多表物化视图(定时调度刷新),减少手动建模的活。
4、 查询引擎
查询引擎基于 MPP 架构,节点间和节点内都做并行执行。大表关联走分布式 shuffle join。
引擎全面向量化,内存结构按列布局,减少虚函数调用,提高缓存命中率,用上 SIMD 指令。官方数据是宽表聚合场景比非向量化引擎快 5 到 10 倍。
运行时会用自适应查询执行技术,根据运行期统计信息动态调整执行计划。比如生成 runtime filter 推到探测端的最底层扫描节点,减少要处理的数据量,提升 join 性能。Runtime filter 支持 In、Min、Max、Bloom Filter。
执行层用了 Pipeline 引擎,把查询拆成多个子任务并行跑,充分利用多核 CPU。同时解决了线程爆炸的问题,限制查询线程数。Pipeline 引擎减少数据拷贝和共享,优化排序和聚合操作。
优化器方面,CBO、RBO、HBO 三种策略配合使用。RBO 做常量折叠、子查询改写、谓词下推;CBO 做 join 重排;HBO 基于历史查询信息推荐最优执行计划。
5、 兼容性和生态
Doris 兼容 MySQL 协议,支持标准 SQL。用 MySQL 客户端工具就能连上去,BI 工具这边 Tableau、Power BI、Superset、FineBI、DataEase 都能接。
数据导入支持多种方式:从 HDFS/S3 批量导入,从 MySQL Binlog/Kafka 流式导入,通过 HTTP 接口微批写入,通过 JDBC 实时写入。
和大数据生态的对接也比较全:Spark 通过 Spark-Doris-Connector 读写 Doris,Flink 通过 Flink-Doris-Connector 实现 exactly-once 写入,DBT 有 Doris Adapter 做数据转换。
6、 谁在用
Doris 在 2022 年 6 月从 Apache 学习期毕业,成为顶级项目。
国内用户覆盖面比较广,市值排名前五十的互联网公司里,超过八成在生产环境用 Doris,包括百度、美团、小米、京东、字节跳动、腾讯、网易、快手、新浪等。金融、能源、制造、电信这些传统行业也有不少团队在用。
一个集群,两种进程,标准 SQL,亚秒级查询。如果你的场景是实时报表、即席查询或者想统一实时和离线分析的架构,Doris 值得试一下。
个集群,两种进程,标准 SQL,亚秒级查询。如果你的场景是实时报表、即席查询或者想统一实时和离线分析的架构,Doris 值得试一下。