考察点
这道题出自字节跳动数据仓库工程师一面,属于数仓岗位的"开场题",几乎必问。面试官不是要你背 ODS/DWD/DWS/ADS 四个缩写,而是想看你有没有真正参与过一套数仓从零到一或从乱到治的过程:每层放什么、边界怎么划、怎么防止烟囱式开发、团队怎么协作。追问常往"DWD 的明细粒度怎么定"、"DWS 和 ADS 的边界在哪"、"你们怎么管控指标口径"走。
参考答案
建设方法论:自上而下设计,自下而上实现
数仓建设的主流打法是 Inmon 的自上而下设计与 Kimball 的维度建模结合。实操上一般是:先和业务方、分析师对齐核心业务过程(比如电商的下单、支付、履约、退款),梳理出数据域和主题域的划分;然后针对每个业务过程做总线矩阵——行是业务过程,列是一致性维度(时间、用户、商品、商家、渠道),矩阵定下来,整个数仓的骨架就定了。之后才是逐层落地。
落地节奏上不要一步到位。先挑一两个核心域(通常是交易域)打样,把分层规范、命名规范、调度依赖、指标口径管理的流程跑通,再推广到其他域。一开始就全域铺开,十有八九会失控。
各层职责与边界
ODS(贴源层):原样接入业务库 binlog 和日志,只做格式统一和增量/全量标识,不做业务逻辑加工。保留原始数据的意义在于回溯——下游任何加工出错了都能回到源头重算。接入方式上,业务库走 DataX 全量或 Canal/Flink CDC 增量,日志走 Flume/Filebeat 进 Kafka 再落 Hive。
DWD(明细层):对 ODS 做清洗、规范化、维度退化。清洗指去重、脏数据过滤、字段类型统一;规范化指统一编码(比如把各业务线不同的性别表示统一成一套字典);维度退化指把常用维度属性(商品类目、城市名称)直接冗余进事实表,减少下游 join。DWD 的粒度坚持"最细粒度",一行代表一次原子业务事件,这样上层任何口径都能从它聚合出来。
DIM(维度层):一致性维度的物理落地,用户维、商品维、商家维等,拉链表处理缓慢变化维也在这里。
DWS(汇总层):按主题做轻度汇总,典型粒度是"一个用户一天"、"一个商家一天"这样的宽表。它沉淀的是可复用的公共汇总逻辑——"用户最近 7 天下单次数"算一次全公司用,而不是每个需求各算一遍。这一层是复用度的关键,建得好能砍掉大量重复计算。
ADS(应用层):面向具体报表和产品需求的个性化指标,比如经营驾驶舱、活动效果分析。这一层允许"贴需求定制",但指标口径必须来自 DWS 或更下层,不允许绕过中间层直接扫 ODS。
分工模式
字节的实践是按"域 + 层"两个维度分工。横向按数据域分组:交易组、用户组、流量组、直播组,每组对本域从 DWD 到 DWS 负全责,保证域内口径一致。纵向有公共团队:数据平台组负责接入工具、调度系统、数据质量监控;指标管理组(或数据中台团队)负责统一指标字典、口径评审。ADS 层通常贴近业务,由对口业务的分析师或数据 BP 主导,数仓团队提供 DWS 支撑。
协作上两个机制很关键。一是需求评审时先过总线矩阵和指标字典,确认是不是已有口径的变种,防止同一个指标五种算法;二是模型评审制度,新建 DWD/DWS 表要经过领域负责人评审粒度、命名、分区设计,把规范卡在代码评审环节,而不是事后治理。
防退化机制
分层最大的敌人是"退化"——用着用着 DWS 没人维护了,需求都从 DWD 甚至 ODS 直接拉。治理手段一般包括:表血缘分析,看 ODS 被直接引用的比例,超过阈值就告警;存储和计算成本归账到团队,倒逼复用;以及定期下线无人访问的表。面试时提到"血缘 + 成本归账"这种工程化治理手段,比空谈分层理念更能加分。
可能的追问
- DWD 为什么坚持最细粒度?粗粒度会丢信息,新口径来了又得回炉重造;最细粒度虽然存储大,但任何上层口径都能一次聚合出来,长期看更省。
- DWS 和 ADS 边界模糊怎么办?判断标准是复用性:两个以上需求会用的汇总放 DWS,单一需求专用的放 ADS。拿不准就偏 ADS,避免 DWS 膨胀成垃圾场。
- 拉链表用在哪、什么代价?缓慢变化维(如用户等级、商家状态)用拉链表存历史,代价是查询要带时间条件且存储翻倍,高频变化的维度不值当,按天快照更划算。