data-engineering · git:20260908.a2a662c · 2026-09-08 · sha256 c39d39007d9d3be7
data-engineering git:20260908.a2a662cA
Immutable. This exact content is served forever at /api/v1/blob/c39d39007d9d3be7.
--- name: data-engineering description: 数据工程出题:数仓分层与维度建模、离线与实时链路、调度与数据质量、存储格式与湖仓、成本与性能。岗位或简历涉及数据开发、数仓、大数据开发、ETL 时加载。 keywords: [数据开发, 数仓, 大数据开发, etl, data engineer, hive, spark, flink, 维度建模, 实时数仓, 湖仓, iceberg, paimon, dolphinscheduler, 数据质量] layer: domain --- ## 岗位职责与考察重点 数据开发 / 数仓工程师负责把业务数据变成可信、可用、可持续交付的数据资产:建模分层、写离线和实时任务、维护调度依赖、保障数据质量与 SLA、控制存储与计算成本。真实面试里被问最多的是建模判断(这张表该怎么设计、口径谁定)、链路事故(数据晚了、错了、重了怎么查)、以及性能与成本(任务跑不完、集群费用涨了怎么办)。面试官最在意三件事:一是有没有真正对数据准确性负过责——出过事故、补过数、回溯过口径;二是建模能不能落到业务,而不是背 Kimball 四步;三是对链路全貌的理解:从埋点采集到报表,哪一环出问题会怎么表现。 校招侧重 SQL 功底(窗口函数、多表关联、去重与留存计算)、数仓分层与维度建模的基本概念、Hive/Spark 的执行原理;社招侧重实时数仓与湖仓选型、数据质量体系、任务治理与成本优化、跨团队口径协调。一线大厂近年明显更看重"数据资产化"与"降本",外企则更关注 pipeline 的工程规范(测试、版本、幂等)。 ## 主题 ### 数仓分层与建模落地 - 阶梯:ODS/DWD/DWS/ADS 各层解决什么问题 → 为什么分层能减少重复计算、隔离变化,分层过多的代价 → 业务方直接查 ODS 绕过数仓、DWS 表爆炸式增长怎么治理 → 宽表 vs 星型模型、一致性维度与"每个业务线自建一套"的取舍 - 好题:你接手一个有 3000 张 DWS 表、一半没人用的数仓,怎么判断哪些能下线、下线过程怎么保证不影响下游? - 危险信号:只会背分层名字;说不出自己负责过的表在哪一层、上下游是谁;认为"多建宽表就是好" - 期望信号:能用血缘和访问日志判断表价值;理解公共层复用率指标;知道分层是为了口径统一,而不是为了分层本身 ### 维度建模与事实表设计 - 阶梯:事实表与维度表的区别,粒度怎么定 → 事务事实表、周期快照、累积快照各自适用场景 → 订单状态频繁变更导致事实表重复、指标口径不一致怎么排查 → 缓慢变化维(SCD2 / 拉链表)的存储与查询代价,什么时候干脆存快照 - 好题:电商订单从下单到签收有 6 个状态,业务既要看每日各状态数量又要看每笔订单的完整流转时长,你怎么设计事实表?拉链表在这里合适吗? - 危险信号:粒度说不清;把所有字段堆进一张表;不知道拉链表回溯查询怎么写 - 期望信号:先定粒度再定字段;累积快照处理多阶段流程;理解退化维度与代理键;知道 SCD2 对下游 join 的影响 ### 离线链路与 SQL 优化 - 阶梯:一条 Hive/Spark SQL 的执行流程 → 分区、分桶、小文件对性能的影响 → 任务从 30 分钟涨到 3 小时怎么定位(数据倾斜、笛卡尔积、分区裁剪失效)→ 加资源、改 SQL、改模型三种手段的优先级 - 好题:一个每天凌晨跑的 DWS 任务最近经常超时影响下游 SLA,你按什么顺序排查?如果是数据倾斜,你会用哪些手段、各有什么副作用? - 危险信号:直接说"加 executor";不看执行计划;不知道倾斜表现为什么是少数 task 跑很久 - 期望信号:先看执行计划与 stage 耗时分布;分区裁剪、谓词下推是否生效;倾斜 key 的定位与拆分;小文件合并策略 ### 实时链路与流处理 - 阶梯:实时和离线各自解决什么,Lambda 与 Kappa 差异 → Flink 的 checkpoint、状态、watermark 分别做什么 → 实时指标与离线对不上、迟到数据、乱序、状态膨胀怎么处理 → 端到端 exactly-once 的代价,什么场景 at-least-once + 幂等就够 - 好题:实时大屏 GMV 与 T+1 离线报表差了 2%,业务问哪个对,你怎么定位差异来源?最终你会怎么向业务解释两套数的关系? - 危险信号:认为实时数据一定准;不知道 watermark 与迟到数据的关系;exactly-once 只会说"Flink 支持" - 期望信号:能列出差异来源(迟到、去重口径、维表更新时机、时区);理解状态 TTL;知道下游 sink 的幂等或事务写入才是端到端一致的关键 ### 调度与任务治理 - 阶梯:为什么需要调度系统而不是 crontab → DAG 依赖、重跑、补数、幂等分别怎么保证 → 上游延迟引发下游连锁失败、任务重跑导致重复写入怎么处理 → SLA 分级与基线告警的设计,资源队列的优先级怎么定 - 好题:凌晨核心表上游延迟 2 小时,下游 200 个任务排队,你怎么设计调度策略让最重要的报表按时出?事后怎么避免同类问题? - 危险信号:不知道任务是否幂等;补数靠手工改日期跑;没有基线或 SLA 概念 - 期望信号:任务写入按分区覆盖保证幂等;核心链路基线告警;依赖检查用分区就绪而不是固定时间 ### 数据质量与可观测 - 阶梯:数据质量看哪几个维度(完整性、准确性、一致性、及时性、唯一性)→ 规则校验放在链路哪个位置,阻断还是告警 → 指标突然掉 30% 是数据问题还是业务问题怎么快速判断 → 全量校验的成本与抽样、分层校验的取舍 - 好题:某天 DAU 报表比前一日掉 30%,业务半小时后要答复,你在这半小时里查什么?怎么区分是埋点丢失、任务跑错还是真实下跌? - 危险信号:只有"跑完了"没有"跑对了"的检查;出问题从上游一张张表人肉看 - 期望信号:从源头波动率、分区记录数、主键唯一性逐层排查;有血缘辅助定位;核心表配置阻断规则 ### 存储格式与湖仓 - 阶梯:Parquet/ORC 为什么适合分析 → 列式存储、压缩、谓词下推的原理 → 湖仓表(Iceberg/Hudi/Paimon)解决 Hive 表哪些痛点(ACID、schema 演进、小文件、时间旅行)→ 从 Hive 迁到湖仓的收益、成本与风险 - 好题:团队想把实时写入的 Hive 表迁到 Iceberg 或 Paimon,你会怎么评估收益?迁移中最怕什么问题? - 危险信号:说不出行存和列存的区别;把湖仓当成"新名词"而不知道它解决的具体痛点 - 期望信号:理解快照、元数据文件与小文件治理的关系;schema 演进对下游影响;流式 upsert 场景的适配性 ### 指标口径与数据资产管理 - 阶梯:同一个"活跃用户"为什么各部门数字不一样 → 指标定义(原子指标、派生指标、修饰词)与统一口径 → 口径变更后历史数据要不要回溯、怎么通知下游 → 指标平台 vs 靠文档约定的投入产出 - 好题:产品、运营、财务对"订单数"各有一套口径,你怎么推动统一?统一后历史报表怎么处理? - 危险信号:认为口径是业务的事与数仓无关;口径改了没有变更记录 - 期望信号:区分原子指标与派生指标;口径变更有版本与生效时间;血缘能找到所有受影响的下游 ### 成本与性能优化 - 阶梯:数据平台成本花在哪(存储、计算、调度空转)→ 冷热分层、生命周期、压缩、任务合并各省什么 → 集群账单月涨 40% 怎么归因到具体任务和负责人 → 降本与 SLA、开发效率的冲突怎么协调 - 好题:给你一个月的任务运行日志和存储清单,你怎么在两周内把成本降 20%?先动什么、怎么保证不影响业务? - 危险信号:只想到删表;不知道自己任务的资源消耗 - 期望信号:按任务/表归因成本;识别无人访问的表与重复计算;生命周期策略;把降本量化并跟踪 ### 数据采集与埋点 - 阶梯:日志、binlog(CDC)、接口拉取各适用什么 → CDC 的顺序、删除、schema 变更怎么处理 → 埋点丢数、重复上报怎么发现和补 → 采集侧治理(埋点规范、上线校验)投入与下游清洗成本的关系 - 好题:一个新版本 App 上线后某事件量翻倍,你怎么判断是埋点重复还是真实增长?采集侧要加什么机制避免下次再猜? - 危险信号:认为数据来了就是对的;不知道 binlog 里 update 会怎么表现 - 期望信号:埋点校验与灰度对比;CDC 处理 delete 与主键变更;采集侧带版本号 ### SQL 现场题与执行原理 - 阶梯:去重、topN、连续登录、留存这类题怎么写 → 窗口函数、多表 join 的行数放大、null 参与比较与聚合的语义 → 同一段 SQL 在 Hive 与 Spark 结果不一致、count(distinct) 跑不动怎么处理 → 一条复杂 SQL 拆成多步中间表的可维护性与性能权衡 - 好题:写 SQL 求每个用户最近连续登录天数,并说明 join 日期维表和用窗口函数两种写法在数据量很大时各自的性能问题;如果登录表有重复记录,结果会怎样错? - 危险信号:只会 group by 不会窗口;join 后行数翻倍没意识到;count(distinct) 在大表上直接跑不知道会倾斜 - 期望信号:先确认口径再写;用 row_number 与日期差做连续分组;大基数去重用两阶段聚合或近似算法;对结果做总量对账 ## 好题 / 坏题对比 - 坏:数仓为什么要分层?分几层? - 好:你负责的 DWS 层有一张核心宽表被 50 个下游引用,现在要加一个字段并改一个字段口径,你怎么做才能不影响下游、不重跑全部历史? - 坏:说说 Flink 的 exactly-once 原理。 - 好:实时大屏的 GMV 与离线 T+1 报表差 2%,你怎么定位差异来源?哪些差异是可以接受的、哪些必须修? - 坏:数据倾斜怎么解决? - 好:一个 join 任务 200 个 task 里 3 个跑了两小时其他都秒完,你先看什么确认是倾斜、怎么找到倾斜 key、拆 key 加盐会带来什么副作用? ## 项目结合钩子 - 简历出现"搭建数仓" → 追分了几层、粒度怎么定、公共层复用率、你自己建的表被多少下游用 - 简历出现实时数仓 / Flink → 追状态大小、checkpoint 间隔与耗时、迟到数据处理方式、出过什么事故 - 简历出现"数据质量体系" → 追规则数量、阻断率、误报率、最近一次靠它拦住的问题 - 简历出现"性能优化 X 倍" → 追优化前后耗时、怎么定位瓶颈、改了什么、数据量多大 - 简历出现 Iceberg / Hudi / Paimon → 追为什么迁、迁前痛点、小文件与元数据怎么治理 - 简历出现调度平台(Airflow / DolphinScheduler)→ 追任务规模、依赖设计、重跑与补数机制、SLA 达成率 - 简历出现"数据治理 / 指标体系" → 追口径冲突的具体案例、怎么推动统一、变更管理流程 - 简历出现 CDC / Debezium / Canal → 追 delete 与 schema 变更怎么处理、延迟多少、断点恢复怎么做 ## 出题原则 - 所有题目都要挂在"数据准确性"或"链路事故"上:不问"什么是拉链表",问"这个场景用不用拉链表、不用的话怎么回溯"。 - 必须结合候选人的数据规模:日增 GB 级与 PB 级的最优方案完全不同,先问清规模再评判方案对错。 - 不要考组件版本与参数名,考执行原理与排查顺序;候选人说"调参数"要追它改变了执行的哪一步。 - 建模题要给出具体业务场景(订单、日志、用户)与冲突需求,让候选人现场定粒度、说取舍。