数仓分层架构如何设计?
刚接触数据仓库之前,小白我就有一个疑问,数据仓库为什么分层?难道我一一层不能把所有逻辑都写完吗?大佬口中的 ODS,DW 到底是什么含义?经过长时间的工作,也有了自己的理解,跟着小白探索数据分层的真谛。
为什么要分层?
首先,数据仓库为什么分层?
对于较复杂的的逻辑处理,分层可以清晰的看出数据结构,每一个分层都有它的作用域,在开发人员使用表时能够方便的定位和理解;
分层利于开发人员快速定位问题,并清除问题的影响范围,可以快速追踪数据血缘;
规范化的分层,开发一些通用的中间层数据模型,能够减少极大的工作量,提供数据模型的复用性;
数仓分层可以用空间换时间,把一个复杂的问题分层次解决,在数仓的各层解决不同的问题。
分层的核心思想?
分层的核心思想就是解耦,把复杂的问题简单化,这直接影响了数据架构到底分几层。
数据架构分一层可以吗?
答案是可以。我们可以在一个脚本中进行多表加工融合,这也是当前很多“小作坊”比较流行的做法,但是这种逻辑会牵一发而动全身,如果一个点发生变化,都可能要修改整个设计,并且容易事情跟人走,如果在没有注释,那会导致开发人员回头看时也不明白其中负责的逻辑;
按数据处理的逻辑分层可以吗?
同样也是可以。但是可能会导致链条太长,对流程管控难度提升,如果有数据血缘,会发现关系链太长,不利于核查问题。
数据架构应该分几层?
答案是几层都可以,但是要贴合实际业务。总之,记住我们的核心思想是解耦。
到底应该分几层?
没有一个固定的标准说具体要分几层,但是行业内分层比较经典的,就是 ODS->DW->DM 或者 ODS->DWD->DWS-APP,其中:
ODS(Operation Data Store),操作数据层,即原始数据层,又叫贴源层,与业务系统基本同构(可能会增加管理字段),目的是保留历史,解耦业务数据库,这样整个数据平台只需要访问一次业务数据库即可。所以 ODS 层存在的意义是尽可能减少对业务数据库的访问压力。ODS 层有些时候会细分为两层,一个 STG 数据缓冲层,存原始数据,一个 ODS,存简单清洗的数据。
DWD(DataWarehouse Detail),明细数据层,对数据进行清洗、代码统一、字段统一、格式统一、简单聚合等工作。DWD 层存在的意义是做数据的标准化,为后续的处理提供干净、统一、标准的数据。
DWS(DataWarehouse Service),服务数据层,按照业务目标,对已经处理好的数据进行横向汇聚、纵向汇总。按照宽表模型进行数据冗余和预计算,以空间换时间
DM 层,又叫主题层,与主题域不一样,这是在企业级数仓之上,对某个单独业务或者部门专门设立的小型数据集市。DM 层又可以根据业务需求再次拆分
此外可能还会有 DIM(维度),标签层等;
数据架构示例
总结
数据仓库分层的核心逻辑是解耦。如果公司业务比较简单,且相对固定,那我们采用三层架构即可。如果公司数据处理逻辑负责,且还可能会有变化,那我们可以在三层的基础的,多一层解耦,如果公司有大的业务调整,可以再新增一层,主要考虑在有限时间、资源等条件下,兼顾业务的快速变化,在两者之间做一个平衡和取舍。
至于数仓架构到应该分几层,建议按照目前的业务和建设现状,进行合理解构和分层设计,一般刚开始做,建议 3、4 层。规划 1-1.5 年的架构,然后不断的建设、优化、再优化。不断逼近满足所有需求。
评论