Doris/StarRocks 高频面试题通关指南

对于大数据开发和数据仓库工程师来说(尤其是实时方向来说),Apache Doris 和 StarRocks 已经成为面试中无法绕开的高频重头戏。

本文基于真实的面试反馈,为你疯狂输出一波 Doris/StarRocks 最高频的面试题集锦(100%真题,公司名字暂不方便透漏了)。文章梳理了架构原理、核心特性、表设计与优化等方向内容,赶紧收藏,助你斩获心仪的 Offer!

1.架构与底层原理相关

1.1 Doris/StarRocks 的整体架构介绍

(1)存算一体架构

采用 "FE(前端)+ BE(后端)" 分布式架构:

  • FE:负责元数据管理、SQL 解析优化、查询规划及集群调度。

  • BE:承担数据存储、查询执行(计算)及数据副本管理。

整体介绍

  • 设计:计算与存储在同一 BE 节点,数据本地磁盘存储 + 本地并行计算。

  • 优势:数据本地性强,无网络 IO 开销,查询性能极致;架构简洁,运维成本低。

  • 技术细节:数据按 "分片(Tablet)" 分布式存储,多副本保障高可用;BE 通过 MPP 并行框架 + 向量化引擎执行计算。

  • 适用:数据规模稳定、对亚秒级查询要求高的场景(如实时业务监控、核心报表)。

(2)存算分离架构

  • 元数据层: 负责请求规划、查询解析以及元数据的存储和管理。

  • 计算层: 由多个计算组组成。每个计算组可以作为一个独立的租户承担业务计算。每个计算组包含多个无状态的 BE 节点,可以随时弹性伸缩 BE 节点。

  • 存储层: 可以使用 S3、HDFS、OSS、COS、OBS、Minio、Ceph 等共享存储来存放 Doris 的数据文件,包括 Segment 文件和反向索引文件等。

整体介绍

  • 优势:存储 / 计算可独立扩缩,云原生弹性好;利用对象存储实现海量数据低成本存储。

  • 技术细节:BE 查询时从对象存储拉取数据块,部分场景引入本地缓存层优化 IO 延迟。

  • 适用:PB 级超大规模数据、突发计算需求的云原生场景(如互联网用户行为分析)。

1.2 存算一体架构与存算分离架构该如何选择?

在选择 Doris/StarRocks 的存算一体或存算分离架构时,可从业务需求、资源弹性、部署复杂度三个维度决策:

(1)存算一体架构

  • 特点:计算与存储在同一节点,部署简单,无外部存储依赖,数据本地性强,查询性能极致。

  • 适用场景:业务数据规模稳定、对弹性扩缩容要求低,追求极致查询性能的场景(如企业内部核心报表分析、数据量增长平缓的业务)。

(2)存算分离架构

  • 特点:计算与存储解耦,存储依赖共享存储(如 S3、OSS),计算资源可弹性伸缩,云原生适配性强。

  • 适用场景:数据量爆发式增长、需动态调整计算资源(如互联网用户行为分析、流量波动大的业务),或追求存储与计算独立扩缩的云原生场景。

简言之,若业务追求性能稳定、部署简单,选存算一体;若业务需弹性扩缩、适配云原生,选存算分离。

1.3 Doris/StarRocks 在数据湖架构中的应用和优势是什么?

Doris/StarRocks 在数据湖架构中主要作为湖仓一体的分析引擎,实现对数据湖的高效查询分析,核心应用与优势如下:

(1)直接对接数据湖的存储系统(如 HDFS、S3、OSS 等),支持 Parquet、ORC 等主流数据湖格式,无需将数据从湖中迁移,即可对海量数据进行多维度分析查询,实现 "湖仓一体" 的高效分析能力。

(2)关键优势

  • 无缝整合:兼容数据湖多格式(Parquet、ORC 等)与存储系统(HDFS、对象存储等),直接查询湖中数据,无数据迁移成本。

  • 实时分析:依托 MPP 架构和向量化执行引擎,提供亚秒级至秒级查询响应,支持数据湖场景下的实时决策分析(如用户行为实时洞察)。

  • 简化 ETL:直接查询湖中原始数据,减少传统 ETL 的 "抽取 - 转换 - 加载" 步骤,降低数据处理复杂度与时间成本。

  • 成本优化:结合数据湖的低成本存储(如对象存储)与 Doris/StarRocks 的高效查询能力,实现 PB 级数据的经济化分析。

  • 弹性扩展:支持水平扩缩容计算节点,可根据数据湖数据量的增长灵活调整计算资源,适配业务的爆发式数据需求。

1.4 介绍下 Doris 的数据分布、数据存储

Doris 采用 "分区(Partition)+ 分桶(Bucket)" 的两级数据分布策略:

两级分布: 第一级通常基于时间或地域进行 Partition(逻辑划分);第二级基于高基数列(如 user_id)进行 Hash 分桶,将数据打散成多个 Tablet(数据分片)。Tablet 是分布式存储和多副本复制的基本物理单元。

存储文件关系: 数据导入成功后,在物理磁盘上会产生一个带有版本号的 Rowset。Rowset 内部由多个连续存放的 Segment 文件 组成(由 Segment Writer 生成)。

合并逻辑: 后台的 Compaction 线程会定期将多个小 Rowset 按照版本号进行物理合并,最终融合成大 Tablet,以减少文件句柄并提升查询性能。

1.5 介绍一下 BE 的半数写入机制与 Version

在 Doris 和 StarRocks 里,Version 就是数据的版本号,由 FE 统一分配、全局单调递增,每次导入或更新事务提交都会生成一个新版本。

它主要用来实现 MVCC 多版本并发控制,保证读写互不阻塞、查询能拿到一致的快照数据,不会读到未提交或中间状态的数据。同一主键的多条数据会靠 Version 区分新旧,Version 更大的就是最新数据,在 Unique 表和主键表做数据合并、去重覆盖时,就是以 Version 作为判断依据。

同时 Version 也用于分布式事务和多副本一致性,只有所有副本都同步到对应版本,数据才对外可见,从而保证整个集群的数据一致。后台 Compaction 也是按 Version 来合并小文件、清理旧版本,既减少文件数量提升查询性能,又能回收存储空间。

1.6 为什么不用 Doris 做计算引擎,而使用 Doris 做数仓?

Doris 本质上是一个集成了 "一体化存储 + 分布式计算 + 高性能查询" 的 MPP 分析型数据库,而非 Spark 这种纯通用计算引擎。

功能全链路覆盖: Doris 自带高效的列式存储引擎,支持秒级实时摄入、Upsert 强一致更新、多表流式 Join,可以直接完整覆盖数仓的全链路。

极简架构降低运维: 如果只把 Doris 当计算引擎用,意味着前面还要挂一套复杂的存储和元数据组件,不仅浪费了 Doris 优秀的底层列存和内置索引优势,还增加了不必要的架构复杂度和运维麻烦。

目前,市面上有非常多的公司使用Doris做数仓案例,非常成熟。

2.核心特性与性能对比

2.1 Doris/StarRocks 为什么查询这么快?

Doris/StarRocks 查询快的核心原因,是它们围绕 OLAP 场景(多维度分析、大表聚合、复杂查询) 做了全链路的优化------ 从存储层减少 IO 开销、计算层提升处理效率,到查询层智能规划,每一步都是为了尽可能"减少无效数据、最大化硬件利用率"。

优化维度 核心加速原理
整体架构 典型的 MPP(大规模并行处理) 架构,将查询拆分成多个 Fragment,在多节点并行执行。
存储层 列式存储 + 极致裁剪。同类数据连续存放,只读所需列(列裁剪);支持谓词下推;利用前缀索引、ZoneMap(Min/Max)、BloomFilter、倒排索引快速跳过无关数据块。
执行层 全向量化执行引擎。摒弃火山模型逐行处理模式,一次处理一批数据(Block),CPU Cache 命中率极高,并完美适配 SIMD(单指令多数据) 指令集加速。
调度模型 引入全新的 Pipeline 执行模型(异步数据驱动,由 Push 模式替代 Pull 模式),摆脱了传统线程池与线程切换的巨大开销,多核利用率拉满。
优化器 具备先进的 CBO(Cost-Based Optimizer),Doris还有RBO (Rule-Based Optimization)优化器,能够充分利用了丰富的数据统计信息,自动的尽可能的采用最优的策略来优化查询。

2.2 ClickHouse 的 Join 性能为什么比 StarRocks/Doris 差?

分布式架构缺陷: ClickHouse 采用的是两层汇聚的分布式架构,缺乏完善的 MPP 分布式查询层。在大表与大表需要跨节点进行 Shuffle Join 的场景下表现极为鸡肋。

Join 策略单一: ClickHouse 核心仅支持 Global Join(类似 Broadcast)和 Local Join。当右表内存放不下时,数据不得不溢写到磁盘,性能暴跌。而 Doris/StarRocks 完美支持 Broadcast、Shuffle、Bucket Shuffle、Colocate Join 四种策略,能根据 CBO 自动选择最优解。

优化器不足: ClickHouse 缺乏基于成本的优化器(CBO),无法对 Join 操作进行有效的优化。其聚合能力采用 Scatter Gather 模式的 2 阶段聚合,第二阶段为单节点,对内存和 CPU 的消耗较大 。Doris/starrocks 拥有较完善的 CBO,能够根据数据分布和查询计划选择最优的执行方式。其聚合能力采用多节点并行聚合计算,结合 Runtime Filter 技术,进一步提高 Join 性能。

2.3 Doris/StarRocks 有哪些机制来保证数据的高可用?

主要通过以下机制保障数据高可用:

  • 数据分片与多副本:将数据划分为多个分片(tablet),每个分片存储多个副本(replica,建表时候指定副本数)并分布在不同物理节点。即使单个节点故障,系统可从其他节点的副本读取数据,保障数据可访问性。

  • 元数据冗余存储:元数据在多个节点间冗余存储,避免元数据单点故障,保障元数据的高可用与一致性。

  • 多种数据恢复机制:支持备份/跨集群数据同步等方式,可在实际生产故障后,通过备份恢复数据,降低业务中断风险。

2.4 Doris 和 Hive 对比有什么区别?

Hive 是构建在 Hadoop 之上的离线数仓引擎,采用存算分离架构,数据存储在hdfs或者s3上,依赖 MapReduce 或 Spark 执行计算,查询延迟高,以批量 ETL、数据清洗和离线统计为主,事务与实时更新能力较弱。

Doris 是MPP 架构的实时分析数仓,存算一体、自带分布式存储(Doris3.0之后支持存算分离,数据可以存储在hdfs或者s3上,主要是为了节省成本),采用向量化执行引擎,查询延迟低、并发能力强,支持实时写入与 Upsert 更新,更适合交互式分析和高并发报表服务。

3.表设计与高级索引

3.1 Doris/Starrocks 的表模型有哪些?分别适用于哪些场景?

Doris 有Duplicate/Aggregate/Unique三种模型,Starrocks 比它多一个Primary Key,下面介绍这些表模型的机制和适用场景

(1)明细表(Duplicate Key)

机制:按指定列排序存储,数据完全保留(不聚合、不去重),支持任意维度查询。

适用场景:原始数据存储(如用户行为日志、设备埋点数据),需完整保留明细且查询维度灵活的场景。

(2)聚合表(Aggregate Key)

机制:按「聚合键」预聚合数据(如 sum、count、max 等),相同聚合键的新数据会合并旧数据。

适用场景:统计分析场景(如 PV/UV 统计、销售汇总),需高频查询汇总结果,且能容忍数据预聚合的场景。

(3)更新表(Unique Key)

机制:按「唯一键」去重,新数据覆盖旧数据(支持部分列更新),保证唯一键对应的数据唯一。

适用场景:需高频更新部分字段的场景(如订单状态更新、用户信息修改),更新维度固定且无需保留历史版本。

(4)主键表(Primary Key)(starrocks特有)

机制:支持主键级别的插入、更新、删除,提供行级事务一致性,数据按主键有序存储。

适用场景:强事务性需求(如实时业务库同步)、需保留最新状态且高频更新的场景(如用户画像、库存数据)。

核心差异:明细表强调 "完整保留",聚合表强调 "预计算",更新表 / 主键表强调 "数据更新"(主键表事务性更强)。

3.2 Doris/StarRocks 的分区和分桶有什么区别,怎么去选择?

分区是更高层级的逻辑划分,分桶是分区内部的物理存储划分(即分桶是分区内的细分)。分桶会将分区后的每段数据打散为逻辑分片Tablet。

划分依据

  • 分区:基于业务逻辑字段(如时间、地域)。

  • 分桶:基于高基数字段(如用户 ID)+ 哈希算法。

核心作用

  • 分区:快速定位数据区间,减少全局数据扫描量。

  • 分桶:让数据在分区内均匀分散,提升并行查询效率。

选择与结合策略

  • 选分区:数据量大,需频繁按时间、地域等字段快速过滤数据(如实时时序数据查询)。

  • 选分桶:数据含高基数字段,需并行处理多维度查询(如用户行为的并发分析)。

注意:单个 Tablet(分桶)(Tablet 数 = 分区数 * 桶数 * 副本数)的数据量理论上没有上下界,除小表(百兆维表)外需确保在 1G - 10G 的范围内:

如果单个 Tablet 数据量过小,则数据的聚合效果不佳,且元数据管理压力大。

如果数据量过大,则不利于副本的迁移、补齐,且会增加 Schema Change 或者 物化 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)。

3.3 Doris有哪些索引,该如何选择

为了彻底规避全表扫描,Doris/StarRocks 提供了极其强悍的索引机制,Doris 的索引分两大类:

内置索引(自动维护,无需手动创建)

  • 前缀索引:基于有序存储,自动取 Key 列前 36 字节,适合最高频的等值/范围过滤

  • ZoneMap 索引:自动维护每列的 Min/Max/Null 统计,用于跳过不满足条件的数据块

二级索引(手动创建)

  • 倒排索引:适用最广,支持等值、范围、全文检索(MATCH),支持多条件 AND/OR/NOT 组合,首选推荐

  • BloomFilter 索引:适合高基数列(>5000)的等值/IN 查询,存储空间中等,不支持范围查询

  • NGram BloomFilter 索引:专门加速字符串 LIKE 查询

  • Bitmap 索引:适合中等基数(100~100,000)列的等值查询,支持正交多条件位运算

选择建议(三步走)

  • 最高频过滤列 → 放 Key 最前面,利用前缀索引

  • 非 Key 列需要加速 → 优先建倒排索引(通用性最强)

  • 特殊场景补充:LIKE 查询加 NGram BloomFilter;存储空间敏感时用 BloomFilter 替代倒排索引

4.数据操作与性能调优

不丢不重(Exactly-Once): 依赖 Flink Doris Connector。底层利用了 Flink 的两阶段提交(2PC)机制与 Doris 的 Stream Load 2PC。在 Flink Checkpoint 预提交阶段,数据通过 HTTP Chunked 持续写入 BE 但不可见(状态为 Precommitted);当 Checkpoint 成功完成后,Flink 向 Doris 发起 Commit 信号(状态变为 Committed),数据正式对外可见。如果中间任务挂掉,未提交的事务会自动 Abort 回滚。 数据有序性保障:

上游控制:上游数据源能够保证 At-Least-Once 语义,则配合 Doris 的 Label 机制,能够保证 Exactly-Once 语义。

Doris 侧 Sequence 列: 在 Doris Unique 表中启用 Sequence 列,导入时指定业务时间戳或递增序列。即使 Flink 传输由于重试出现微弱的乱序,Doris 底层也会根据 Sequence 值进行版本比较,确保 "大值覆盖小值",绝不会出现旧数据覆盖新数据的现象。

4.2 讲下 Doris 表物理关联(JOIN)的几种常见方式

Doris 在处理多表关联时,底层主要有以下四种数据 Shuffle 策略:

Doris 的 JOIN 物理执行有以下几种数据 Shuffle 方式:

  • Broadcast Join:将右表全量数据广播到所有参与 JOIN 的节点,左表数据不动。网络开销 = N × T(右表),适用范围广但右表不能太大。

  • Partition Shuffle Join:左右表数据都按 JOIN 条件列的 Hash 值重新分发到对应节点。网络开销 = T(左表) + T(右表),适用于通用场景。

  • Bucket Shuffle Join:左表数据不动,只将右表数据按左表的分桶分布进行 Shuffle。网络开销 = T(右表),要求 JOIN 条件包含左表的分桶列,且左表为单分区。

  • Colocate Join:左右表数据都不移动,直接在本地做 JOIN。网络开销 = 0,要求两表属于同一 Colocation Group,分桶列类型和桶数完全一致。

灵活性依次降低,但性能依次提升(前提是桶数足够多,并行度不受限)。此外,底层实现上支持 Hash Join(等值条件)和 Nested Loop Join(非等值/笛卡尔积)两种算子。

4.3 线上出现慢查询(Slow Query)如何排查?

Doris 慢查询排查分以下几步:

  • 定位慢 SQL:通过 Doris Manager审计日志页面搜索 slow_query,或直接查看 FE 节点的 fe.audit.log 文件,或者直接看Doris内置的审计日志表audit_log,过滤出执行时间超过阈值(默认 5 秒)的 SQL。

  • 聚合分析模式:利用日志中的 SqlDigest 字段(SQL 结构的 hash 值)识别高频或高耗时的 SQL 模式,优先优化出现最多的那类。

  • 分析执行计划:用 EXPLAIN 检查执行计划,确认分区裁剪是否生效、Join 顺序是否合理、过滤条件是否下推等。

  • 查看 Profile:用日志中的 QueryId 拉取对应的 Query Profile,重点看 MergedProfile 中各算子的 DependencyWaitTime(定位瓶颈算子),再通过 DetailProfile 深入分析,同时关注 InputRows 是否存在数据倾斜。

针对性调优:根据分析结果,从 Schema 设计(分桶、索引)、执行计划(Join Hint、物化视图)、执行层(并行度、Runtime Filter)逐层优化。

面试通关寄语

回答 Doris/StarRocks 相关问题时,切忌死记硬背。一定要结合自己项目中的真实应用场景(如:"我们在项目中将 ADS 层放到了 Doris,解决了以前 ClickHouse 频繁 OOM 以及多表 Join 性能差的痛点......"),同时把 "分区裁剪、列式存储、向量化、MPP Shuffle、Runtime Filter" 这几个核心高频词汇自然地穿插到你的架构叙述中,体现Doris/StarRocks的极致性能。祝大家顺利通关,拿下心仪的 Offer!

Doris/Starrocks/SelectDB现在企业用的比较多了,小公司会考虑去Hadoop化,直接基于SR/doris构建数仓,大公司使用Doris构建实时数仓或者加速hive查询Olap分析,面试也越来越多。

更多精彩关注:

相关推荐
随身数智备忘录11 小时前
拆解安全生产法三大核心功能,安全生产法如何解决责任不清与事故追责难
大数据·人工智能·安全
少司府11 小时前
Tools相关:深入浅出学Git
大数据·c++·git·gitee·github·仓库·分支
多年小白11 小时前
今日A股 拉
大数据·人工智能·深度学习·microsoft·ai
2401_8685347811 小时前
论快速应用开发方法及应用
大数据·python
humors22111 小时前
听劝和辨劝
大数据·程序人生
cy_cy00212 小时前
地砖感应屏在数字展厅的应用实践
大数据·科技·人机交互·交互·软件构建
扫地的小何尚12 小时前
掌握 Agentic AI 技术:AI Agent 定制方法全景与实践路径
大数据·人工智能·算法·ai·llm·agent·nvidia
互联圈运营观察12 小时前
泛微发布300+可落地AI应用 让组织业务数智升级
大数据·人工智能
阿星AI工作室21 小时前
刘润年中大课笔记:一句话说清AI落地之战的本质
大数据·人工智能·创业创新·商业