欣旺达数据开发一面:数仓分层与实时数仓设计
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 请先做个自我介绍。
- 介绍一下你在部门里面具体负责的项目和你承担的角色。
- 数据的规模是什么样子的?
- 你们这边的数据是实时的还是离线的?
- 说说数仓分层架构。
- 你有没有处理过数据倾斜?
- 如果让你来设计一套系统的数据治理方案,会从哪些方面考虑?
- 数仓出现脏数据之后,一般排查思路是什么?
- 怎么理解数据血缘关系?
- 假设现在要搭建一套实时数仓,你会怎么设计架构?
- 这部分你实际操作过吗?
- 实时数仓如果出现数据缺失,怎么排查和补数?
- 数仓开发也会涉及团队规范,你怎么看?
- 中间件选型和团队技术专家的意见产生冲突,你怎么处理?
- 你日常工作里,AI 主要用在哪些地方?
- 使用 AI 时,AI 生成的代码和系统规范冲突,怎么规避?
- 数据治理和数仓开发免不了和业务沟通,遇到沟通不畅的情况,你怎么解决?
- 你这边有没有什么要提问的?
(作者反问:面试大概分几轮、数据开发团队有多少人。面试官回答:目前两轮,第一轮技术面,后面可能还有其他部门面试;集团有专门数仓团队,本人所在的是事业部,承接事业部内部需求,后续考虑建设事业部数仓并与集团协同。)
《参考解析》
数仓分层架构:经典四层是 ODS(贴源层,原样落地业务库/binlog 数据,不做清洗,只做分区和压缩,保留可回溯性)、DWD(明细层,做清洗、去重、维度退化、统一编码,一般按主题域和事实表组织,粒度最细)、DWS(汇总层,按维度做轻度聚合,比如用户日粒度、商品日粒度宽表,供上层复用)、ADS(应用层,直接对接报表、看板、接口的指标结果表)。中间还会有 DIM(维度层,缓慢变化维用拉链表处理)和 DWT(主题宽表)。分层的目的有三个:一是解耦,底层口径变了只改一层,不用动所有报表;二是复用,DWS 的聚合结果能被多个 ADS 复用,避免重复计算;三是可控,每层可以做质量校验和血缘追踪。回答时要补一句规范:表命名要有层级前缀和更新周期标识(比如 dwd_order_di、dws_user_1d),分区字段统一用 dt,避免各部门各叫各的。
数据倾斜:先给现象——某个 reduce/task 处理的数据量远大于其他,表现为任务卡在 99%、某个 key 处理时间异常长、OOM。常见成因:join 的 key 分布不均(少数热点 key 占大部分数据,比如大客户 ID、null 值、默认值)、group by 维度基数过小、count distinct 全局去重。定位手段是看 Spark UI / Hive 任务的分区数据量分布,或先对 key 做 count 排行找出热点。解法按类型给:join 倾斜用 map join(小表广播)、热点 key 加随机前缀打散后两阶段聚合、SMB join(分桶表按桶 join);null 或默认值导致的倾斜先把无效 key 过滤或单独处理;group by 倾斜用两阶段聚合(先加随机前缀局部聚合,再去掉前缀全局聚合);count distinct 改成先 group by 去重再 count。要补一句根治思路:能从建模层解决就别只在 SQL 层打补丁,比如把热点维度单独拆表、在写入侧做预聚合。
数据治理方案:按六个域给框架。元数据管理(采集表/字段/任务/血缘,形成资产目录,是其他一切的基础);数据质量(定义规则:非空率、唯一性、值域、及时性、一致性,配 DQC 校验任务 + 分级告警 + 阻断机制,问题数据要有隔离区);数据安全与权限(分级分类、脱敏、行列级权限、审计日志);成本治理(存储生命周期、冷热分层、无用任务下线、计算资源配额与慢任务治理);标准规范(命名规范、指标口径唯一化、开发规范、上线评审流程);以及组织机制(Owner 制度、SLA、问题复盘)。落地要强调「先量化再治理」:先出一份体检报告(表数量、僵尸表占比、任务失败率、重复指标数),按影响面排优先级,一个季度解决一类问题,而不是一次性上全部规则。
脏数据排查:标准流程是「定位范围 → 判断类型 → 追溯来源 → 修复 → 加防线」。先确认影响面:哪些表、哪些分区、影响多少下游报表和指标,先止血(暂停下游任务或标记数据不可用,避免污染扩散)。再判断类型:是格式错误、重复、缺失、值域越界,还是口径不一致。然后沿血缘往上追:对比源表数据、检查 ETL 逻辑最近是否有变更、看任务日志和调度记录(是否有补数、重跑导致重复写入),常见根因是上游改字段类型、上游直接改库不通知、任务重跑没做幂等导致数据翻倍。修复上按幂等重算覆盖目标分区,而不是手工改数;同时保留问题数据快照便于回溯。最后加防线:给这张表补 DQC 规则、给上游变更加通知机制、把这次事故写成案例。
数据血缘关系:血缘描述数据「从哪来、到哪去」,分表级和字段级。表级血缘回答「改这张表会影响哪些下游」,字段级血缘回答「这个指标的口径由哪些字段计算而来」。它的价值有四个:影响分析(下线表/改字段前评估影响面)、问题溯源(报表数据不对时快速往上定位到出问题的任务)、口径治理(同一个指标多处计算时能发现重复定义)、以及合规审计(敏感字段流向哪里)。实现上通常靠解析 SQL(AST 解析出输入输出表与字段)、结合调度平台的依赖关系,以及运行时的执行日志采集,落到图数据库里供查询。工程上难在动态 SQL、临时表、UDF 和跨引擎链路的解析覆盖度。
实时数仓架构设计:标准分层是 ODS(binlog/日志经 Kafka 落地)→ DWD(Flink 做清洗、去重、维度关联,写回 Kafka 或湖表)→ DWS(Flink 窗口聚合或 ClickHouse/Doris 物化视图)→ ADS(OLAP 引擎对外服务),整体是 Lambda(离线保准确 + 实时保时效)或 Kappa(统一流处理)两种范式。要讲清几个关键技术选择:数据接入用 CDC(Canal/Flink CDC)而不是业务库直连查询,避免影响线上;维表关联用维表变化流(lookup join + 状态缓存)或广播维表,并处理维度迟到的场景;一致性上,用 Flink checkpoint + 两阶段提交保证端到端精确一次,或者接受至少一次 + 下游幂等;存储上明细放 Kafka/湖(Iceberg/Hudi/Paimon 支持 upsert 和增量读),聚合结果放 OLAP 引擎;服务层要能支撑高并发点查和看板查询。工程上必须配的三件事:指标口径与离线对齐(同一指标实时和离线要能对账)、数据延迟监控(端到端延迟 SLI)、以及回刷历史的能力。
数据缺失排查与补数:排查按链路从下游往上游倒推:先看目标表的分区是否存在、是否有数据;再看任务实例状态(有没有失败、是不是被上游阻塞、调度是否因资源不足延迟);然后看 Kafka 消费位点(是否 lag 或 offset 重置)、Flink 作业是否重启且从错误 checkpoint 恢复、source 端(binlog 位点是否被清理、上游是否没产出);再往上确认业务侧是否真的没产生数据(比如大促停了某类业务、上游系统故障),避免把「业务无数据」误判成「链路丢数」。补数方案按场景选:离线分区直接重跑任务覆盖写入(前提是逻辑幂等);Kafka 丢数用源端 binlog 按时间区间重放(Kafka 保留期内的 offset 重放,或从离线 ODS 回灌);Flink 状态丢失需要从上游重新消费并处理下游重复(配合幂等写入/主键 upsert)。补完必须做两件事:跑数据量对比(与前一天同口径、与离线结果对账)并记录补数操作到变更台账,同时在监控上把「数据量环比波动超阈值」做成自动告警,下次能在小时级发现而不是等到业务投诉。
团队规范与沟通类问题:规范类问题(第 13、14 题)要用「先对齐目标、再谈方案」的结构回答:规范的价值是降低协作成本和事故率,但规范本身要可执行、有 Owner、能随场景演进;与专家意见冲突时不要上升到对人的对抗,先摆数据(压测结果、成本、维护成本、团队熟悉度),把分歧收敛到可验证的指标上,如果仍然无法一致,按影响面升级给决策人,并明确记录「谁决策、依据是什么、什么条件下重新评估」。与业务沟通不畅时,先确认是需求不清楚还是期望不一致:把口径书面化(指标定义、数据范围、更新时间)、给出原型或样例数据让对方确认,建立固定的对接人和变更通知机制;对反复变更的需求用需求评审和冻结期约束,而不是靠加班补。
AI 在日常工作里的用法与规范冲突:数据开发里 AI 主要用在写 SQL 与调优(给出改写建议、explain 解读)、写调度脚本与 Python 处理逻辑、生成文档和数据字典、解释陌生表和字段、以及生成测试数据与用例。规避「AI 代码与系统规范冲突」的做法是三层:一是把规范前置成可执行的约束(SQL 模板、lint 规则、命名检查、CI 里的格式与口径校验),让 AI 的产物先过机器检查;二是把团队规范做成提示词上下文(让 AI 按我们的命名和分层规范产出),而不是事后人工返工;三是高风险改动(涉及资金、核心指标的 SQL)必须人工复核并走评审,AI 只作为初稿工具。核心口径是「规范要靠工具强制,不能靠自觉」。
反问:这场面试里作者问的是轮次和团队规模,得到的信息很关键——两轮技术面、事业部与集团数仓团队的分工关系、后续要建事业部数仓。这类信息比「团队氛围怎么样」有用得多,因为它直接决定你入职后的职责边界。可以继续追问的:实时链路的覆盖范围、数据量级与集群规模、团队内离线与实时的分工比例。