资讯动态

Doris面试高频考点全解析:SQL执行链路、存储设计与高可用实战

发布时间:2026/10/16 6:07:39 来源:尧图企业网站定制
上周我做了一场技术面试候选人简历上写着“熟悉 Doris负责过某数据分析平台”我抛出的第一个问题是“Doris 到底是个什么东西它和 MySQL、Hive 的区别在哪里”结果他背了五分钟架构图却说不清一条 SQL 从客户端到结果集经历了哪些环节。这个题在面试里出现频率极高几乎可以当作“送分题”但大多数人都送不出去。Doris 这类 MPP OLAP 数据库现在已经是数据分析岗位的标配技能尤其是互联网公司做用户行为分析、实时报表、统一数仓出口时几乎绕不开它。面试官问 Doris不是为了让你背官网首页而是想确认你真正用它在生产环境里处理过问题知道哪些东西能碰、哪些东西必须绕开。这篇文章我把面试中最高频的 Doris 考点拆成六部分定位、存储设计、导入一致性、查询优化、高可用运维以及面试现场最容易暴露“没实战”的回答方式。每一部分不光给答案还会告诉你面试官为什么这么问、他自己心里的评分点是什么。1. 面试官问“Doris 是什么”时真正想听到的是什么这个问题听起来很基础却是区分“背过文档”和“真用过”的第一道分水岭。想拿高分你得从两个层面回答先在宏观上说明它是干什么的再讲清楚一条 SQL 的执行链路。1.1 OLAP、MPP 这两个词不能只挂在嘴边很多人张口就是“Doris 是一个 MPP 架构的 OLAP 数据库”但再往下问“MPP 到底解决什么问题”就愣住了。我的建议是这样理解传统 OLTP 数据库典型如 MySQL核心假设是行式存储、小事务、高频并发读写数据按行落地要用索引去定位某一行。而 OLAP 场景的核心动作是扫描千万行、按维度聚合、算指标数据往往只进不删。这个差异决定了 Doris 采用列式存储、批量压缩、向量化执行牺牲掉一部分单行读写体验换来全表分析时的吞吐。MPPMassively Parallel Processing则是 DORIS 横向扩展的骨架。它把查询拆成多个子任务分发到多个节点上并行执行最后汇总结果。面试时如果能补一句“FE 负责拆BE 负责算数据尽量本地化”比把“大规模并行处理”背十遍都管用。还可以顺手对比一下 Hive。Hive 是离线数仓时代的大表 SQL 工具底层跑 MapReduce/Spark延迟通常秒级到分钟级。Doris 定位是“既能承接离线导入的批量数据又能支撑实时写入的明细数据和在线报表查询”所以面试官常听你说“用 Doris 统一了离线与实时出口”这句话就踩在他想要的点上。1.2 一条 SQL 从客户端到结果集的完整链路这个问题稍难一点但只要你画得出执行链基本能证明你碰过真环境。客户端连接的是 FEFrontend。FE 做四件事接收 SQL、解析语法、做逻辑优化和物理优化、生成分布式执行计划。逻辑优化包括谓词下推、投影裁剪、子查询重写物理优化则要决定哪些数据放在哪个 BE 上执行、哪些数据需要跨节点传输。接下来 BEBackend接收计划。每个 BE 上有大量 tablettablet 是数据存储和计算的最小物理单元。SQL 下推到 BE 后先做分区裁剪和桶裁剪把根本不需要读的 tablet 直接过滤掉再按列读取数据走向量化执行引擎做过滤、聚合、连接最后各 BE 把部分结果返回给 FE 汇总。面试官想听的关键词通常是这几个FE 负责元数据和查询计划BE 负责存储和计算扫描过滤尽量下推最终结果不一定要扫全表。你在回答时如果能提到“谓词下推”和“分区裁剪”他基本就会认定你不是只会写 SQL 的人。2. 表模型、索引、分区分桶存储设计是最容易翻车的地方Doris 的存储设计是面试重灾区因为很多人只会在建表时抄模板完全没想过表模型为什么存在、索引什么时候生效、分桶数调多了会怎样。这一节的题基本都是用来“筛掉只会背 DDL 的人”。2.1 三种表模型的区别与选择Doris 三种模型Duplicate Key明细模型、Aggregate Key聚合模型、Unique Key唯一模型。很多面试题的坑在于让你选模型你却在背定义。先看一段聚合模型的建表语句CREATE TABLE user_channel_stat ( stat_date DATE, channel_id BIGINT, play_cnt BIGINT SUM DEFAULT 0, watch_duration BIGINT SUM DEFAULT 0 ) AGGREGATE KEY(stat_date, channel_id) DISTRIBUTED BY HASH(channel_id) BUCKETS 16;语义很清楚相同(stat_date, channel_id)下的play_cnt、watch_duration会按 SUM 预聚合。适合“固定维度的指标报表”比如按渠道看日播放量。但代价是明细没了你想直播出每一条用户行为记录就做不到。Duplicate 模型就是干这个的它保留原始数据不去重、不预聚合适合日志明细、行为轨迹。查询时需要实时聚合你能算出想要的结果但得扫描对应的全部分区。Unique 模型则解决“同一主键只保留最新一条”的问题用于订单更新、状态修改等 upsert 场景。面试高分的答法一定是带场景的日志明细选 Duplicate固定指标报表选 Aggregate需要更新覆盖的选 Unique。顺便提一嘴“Unique 模型在较新版本里支持 merge-on-write写入时提前做合并点查和大量更新场景更友好”这句话十个人里只有两三个说得出来。2.2 前缀索引与布隆过滤器不是所有索引都能生效Doris 没有 MySQL 那种可以随意建的 B 树二级索引它靠的是排序键形成的前缀索引和数据本身的列式存储特性。前缀索引的原理是每个 tablet 内部按建表时指定的 key 列顺序排列Doris 对每 36 字节的数据生成一条稀疏索引。也就是说如果你查询条件命中了排在最前面的几个 key 列就可以快速跳过大量数据如果条件字段不在前面前缀索引就帮不上忙。举个反例把一个大文本字段放在 key 列第一个位置动不动几百字节36 字节的前缀索引被它一个字段就撑爆了后面的高价值过滤列根本排不进来。正确做法是结合查询频率把基数不高但经常过滤的维度放在最前面大字段往后放。布隆过滤器也要会聊。它是为高基数列设计的比如user_id因为前缀索引覆盖不到后面的列布隆过滤器可以在读取前先判断“这个 tablet 里有你要的值吗”压根不存在的直接跳过。注意如果列基数很低布隆过滤器不仅没用还浪费内存面试时可以主动补一句“Bloom Filter 不是建了就快低基数列会适得其反”。2.3 分区分桶并行度和倾斜才是关键分区分桶这个问题一开口就暴露你有没有在大数据量下跑过。分区PARTITION按范围划分最常用的是时间比如PARTITION BY RANGE(stat_date)。分区的好处是方便管理定期删旧区、按天增量导入、动态分区自动创建。数据量到了几十亿行分区裁剪能直接砍掉 90% 的扫描量。分桶BUCKET是哈希分桶将每个分区内数据再切分到多个 tablet 上Doris 的并行扫描能力就来自这些 tablet。面试常问“分桶数怎么定”标准参考是让数据在 BE 节点间尽量均匀桶数至少不小于 BE 数量并且刻意避开基数极低的字段。很多人在这里踩坑分桶键选了status只有两种取值所有数据只散到两个桶其余桶空的查询并行度全废。正确姿势是用高基数、分布均匀的字段做分桶键比如user_id。至于“桶数是不是越多越好”答案是否定的tablet 太多会让元数据膨胀、导入的小文件变多BE 内存开销也大要按实际数据量和节点规模平衡。3. 导入链路与一致性数据进来才算数Doris 的导入题在面试里几乎是必问的。原因很简单分析型系统的难点从来不只是查得快更在于怎么把数据稳定、不重复、不丢失地送进来。这一节会一直考到 label、事务、失败排查。3.1 三种导入方式如何选择Stream Load、Broker Load、Routine Load 是面试官最爱的三件套。很多人能把英文名背全却说不清到底什么时候用哪个。导入方式数据源典型场景核心特点Stream Load本地文件 / HTTP 流实时或准实时导入数据在应用侧直接推给 Doris轻量、低延迟适合几十 MB 到几 GB 的小批量Broker LoadHDFS、S3、OSS 等对象存储离线大批量导入从数据湖同步到 Doris通过 Broker 并行读取对大文件很友好Routine LoadKafka持续消费实时消息流常驻任务自动拉取适合实时数仓链路我一般会提醒候选人用一句话解释选择逻辑数据已经落 HDFS/S3 就走 Broker Load数据还在 Kafka 或实时产生就 Routine Load临时要灌一批本地文件就 Stream Load。面试官不要求你背接口细节但你要能说出“Routine Load 的本质是持续不断地生成导入事务”这种层面的理解。3.2 label 机制与事务幂等Doris 每个导入任务都可以指定一个label它在库内是唯一的。导入成功后这个 label 就固化下来如果程序重试并传入同一个 labelDoris 会识别为重复任务并直接返回成功但不会真的重复写数据相当于天然做了幂等控制。这个机制面试价值极高因为背后对应的是“数据一致性”。导入不是一条条插入而是以事务方式提交要么整个版本对外可见要么失败回滚不会让下游查到半截数据。能回答到这一层说明你真的处理过“重试、断点、脏数据”这些问题。实际排错的时候也要通过 label 去查导入状态和错误信息。别一导入失败就删表重建先看错误 URL 里的具体行数往往只是某一行 JSON 字段格式不对改掉重试完事。面试时把这个细节说出来基本能证明你有线上处理经验。3.3 导入性能与常见坑这里提两个高频坑一是小文件过多二是目标表分桶数过少。小文件过多时BE 要处理大量碎片化导入任务版本数量暴涨查询合并开销变大。解决办法是合并小文件后再批量导或适当调大单次导入量。分桶数过少同理tablet 少意味着导入并行度上不去大批量数据只能挤在少数几个桶里慢慢写。性能调优还有个方向是均衡 BE 负载。导入路由会根据 tablet 分布把任务分发到不同 BE如果某块盘容量快满或某 BE 负载特别高数据倾斜就会越来越严重。面试时能提到要关注磁盘水位和 tablet 均衡比单纯背参数强很多。4. 查询优化与 Join 策略为什么同一张表你写得比别人慢十倍“同样的数据同样的 SQL为什么我查要 30 秒别人只要 1 秒”是 Doris 面试的高频题。数据结构、表模型、索引都聊完之后就该进入执行层面了。4.1 Colocate Join当本地化成为杀手锏Doris 中 Join 有几种常见策略Broadcast Join 把小表广播到每个节点、Shuffle Join 把数据按照连接键重分布、Colocate Join 则利用预先设计好的分桶关联直接让数据在本地完成匹配。Colocate Join 的原理适合用生活类比两个大团队要开会Broadcast 是把一份材料复印给所有人Shuffle 是所有人先按座位号换到自己该去的位置再开始而 Colocate 是两拨人从第一天起就按相同规则坐在同一排面对面就能谈。实际使用条件必须是两张表的桶键完全相同、分桶数完全一致并且 join 条件里包含这个桶键的等值条件。面试时能主动指出“Colocate 不是万能的表结构设计阶段就要刻意对齐”这是加分项。因为很多团队都是表建完了才想起要做 Colocate结果只能重建。4.2 Rollup 与物化视图预聚合不是银弹Doris 的 Rollup 和物化视图都是“预计算”思路面试官喜欢拿它们来测你的取舍能力。Rollup 是基于表模型做的维度上卷比如一张明细表按天、按渠道算好指标存起来查询命中时直接读结果不必实时聚合。物化视图则更通用一些它能预先计算好某条常用 SQL 的结果并由优化器自动判断是否命中。这里最容易犯的错误是认为预聚合越多越好。物化视图过多会拖慢导入性能因为每次导入都要额外维护一份数据。面对“要不要加一个物化视图”的问题正确答案是先看查询频率和计算成本这条 SQL 天天跑、实时聚合慢到不能忍才值得建一个月跑一次的大聚合建了就是浪费。4.3 调优的基本顺序从谓词下推到内存参数把查询调优讲成“加内存”是面试大忌。合理的思路是有顺序的先在 SQL 和表结构层面优化再看会话级别参数。常见优化顺序包括确认过滤条件能落在分区和时间范围内确认高频过滤列在前缀索引或 Bloom Filter 覆盖范围内分析执行计划是否为等值 Join、是否存在笛卡尔积最后才去调查询超时、内存上限、并行度等会话参数。我在面试时最怕听到候选人一口咬定“Doris 慢就调内存”真正的查询性能问题七八成在表结构设计和 SQL 写法上就已经决定了。5. 高可用与运维FE/BE 架构最容易露馅的地方很多人对 Doris 的印象停留在“能跑 SQL”一聊架构就支支吾吾。但在真实生产环境里高可用、容灾、配置翻车才是运维最头疼的事也是面试官判断你有没有“维护过集群”的关键。5.1 FE 的 Leader/Follower/Observer别只说“主从”用“一主一从”来形容 FE 是典型的外行话。Doris 的 FE 有三种角色Leader、Follower、Observer。角色是否参与选举是否能写元数据主要用途Leader参与是负责元数据写操作是集群主节点Follower参与否接收写请求会转给 Leader保证高可用参与元数据一致性投票Observer不参与否只同步元数据副本用于扩展读能力和接入更多流量Follower 之间通过多数一致性协议来保证元数据不丢。所以生产环境通常建议至少 3 个 FE其中 1 个 Leader、2 个 Follower奇数才能保证多数派投票。Observer 则是后来加的“读扩展节点”不参与投票适合集群很大、FE 读压力高的场景。如果你能在回答里区分“元数据高可用”和“数据高可用”是两件事面试官对你的评价立刻不一样FE 解决元数据的一致和可用BE 解决数据的多副本存储和查询扩展。5.2 BE 挂掉之后数据真的不会丢吗这个问题把很多人问懵因为不少人以为 BE 挂掉数据就全没了。实际上 Doris 每个 tablet 默认会有多个副本生产中常配 3 副本。某个 BE 宕机后它上面承载的副本会在其他 BE 上自动补副本直到恢复目标副本数所以数据不会因为一台机器宕机而丢。但这不等于你可以对 BE 掉线无动于衷。副本数如果大于等于 BE 数量会出现副本找不到地方分配的问题如果机架或交换机层面做了容灾规划还需要考虑副本的放置策略。面试时能说出“副本会自动修复但修复期间集群冗余度下降要尽快把节点加回来”就非常到位。另外BE 上有数据版本机制。副本之间的数据更新不一定同时完成靠版本号保证查询只会读到干净、完整的数据不会把同步到一半的副本发给用户。这也是 Doris 和 HDFS 那种“简单复制”不一样的地方。5.3 我踩过的部署配置翻车点真想拿高分的候选人通常还能讲一两个实践中的教训。我自己的经验里至少有三个翻车点值得分享第一BE 的内存配置拍脑袋。BE 内存上限设置过高操作系统直接 OOM设置过低大查询频繁失败。要结合机器物理内存、节点上同时运行的查询数来定并留足系统缓冲。第二FE 的元数据目录没有独立规划。FE 元数据文件虽然量不大但增长累计起来很可观如果和操作系统盘共享一个小分区几次异常退出就能把磁盘写满整个集群跟着遭殃。第三多磁盘场景不配置 storage_root_path。很多部署只挂一块盘数据量一大就遇到 IO 瓶颈。多块盘、混合介质SSD 缓存加 HDD 存储的配置直接决定了大规模集群的查询上限。面试时你能主动提“磁盘和存储路径是要提前规划的”说明你真的上线过集群。6. 面试现场三类回答一听就没实战过技术点都聊完了最后送你一份“避雷清单”。这些都是我在面试现场真实听过的高频翻车回答照镜子看看你有没有中招。6.1 只会背诵官方架构图“Doris 分为 FE 和 BEFE 解析 SQLBE 存储数据支持高并发实时查询。”这段话听起来没毛病但基本等于没说。因为它没回答“为什么需要两个角色”“FE 挂了会发生什么”“BE 上数据怎么分布”。如果你能把上一节的 Leader/Follower 机制、tablet 副本、版本对账讲清楚哪怕只讲 30 秒说服力都比复述架构图强十倍。真正的区别在于背定义是“我知道有这么个东西”讲机制是“我理解它是怎么运行的”。面试官要的是后一种人。6.2 拿 MySQL 的思维生搬硬套最容易翻车的是拿 MySQL 的索引思维套 Doris。有人一听说查询慢就要求“建一个二级索引”。Doris 的存储模型决定了它靠列存、前缀索引、Bloom Filter 和分区分桶来加速而不是靠任意列建索引。还有人对唯一键的理解是“这就是 MySQL 主键”。在 Doris 里唯一键模型更像“按主键覆盖更新”每次导入都对相同键做版本淘汰不是传统数据库的原地更新。用 MySQL 思维解释 Doris面试官立刻知道你没碰过真实的分析型系统。6.3 在错误的场景里谈“高并发”网上很多文章喜欢把 Doris 的特点写成“高并发”于是面试时有人就说“Doris 能支持像淘宝秒杀那样的高并发”。这个理解偏差比较严重。Doris 适合的高并发是实时报表、仪表盘这种成百上千个分析型查询同时跑而不是百万级在线交易写入。它连 MySQL 协议是为了接生态不是让你拿它当业务交易库。面试官如果顺着问“你会拿 Doris 存订单交易数据吗”可靠回答是“不会订单这类强事务强一致性数据仍在 OLTP 库Doris 承接由 OLTP 同步来的宽表和分析结果”。我自己带人时有个习惯面试题结束后会让候选人用“场景加一句话”的方式收尾比如“这个用户标签宽表我用了 Unique 模型分桶键是 user_id导入走 Routine Load查实时圈选秒级返回”。只要他能说出这种句子我就知道他是真写过 Doris、真排过错的人而不是把官网首页倒背如流的搜索引擎。准备面试时与其背更多参数不如多问自己一句这种场景我上线的时候究竟是怎么处理的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑