本文为系列文章第三篇,详细剖析了数据仓库分层下的贴源层和数据仓库层设计。
上文回顾:
《(一)从分层架构到数据湖仓架构:数据仓库分层的概念与设计》
(二)从分层架构到数据湖仓架构:数据仓库分层下的技术架构与举例
贴源层
ODS, Operational Data Store

数据引入层(ODS,Operational Data Store),也称为数据基础层。
这一层主要存放从源系统引入的原始数据,几乎不做任何加工处理,目的是将基础数据直接同步到数据仓库中,便于后续的数据处理工作。在结构上,ODS层的数据与源系统保持高度一致,是数据仓库的数据准备区。
在现代数据架构中,ODS层的数据获取方式逐步向CDC(Change Data Capture,变更数据捕获)模式转变,尤其在数据湖和实时数据仓库的场景中。新型的ETL工具已经可以支持源系统的DDL(数据定义语言)变更,这意味着当源系统的字段发生变化时,ODS层可以自动更新表结构,无需手动调整。例如,这样的工具支持多种系统的DDL变更捕获,保证了ODS层数据在数据仓库、数据湖或实时数据仓库中的一致性,不会因为源系统的改变而中断ETL流程。
ODS层的数据通常分为当前数据和历史数据两部分:
当前数据表:用于存储最近需要处理的数据,保持最新的数据状态。
历史数据表:保存已处理完的数据以备后续使用,一般保留3-6个月后清理,具体时间视项目需求而定。如果源系统的数据量较小,也可以选择更长时间的保存,甚至全量保存。
尽管ODS层主要作用在于数据引入,但并非完全不做处理。此层通常会进行基本的数据清洗,例如:
一些公司会选择在ODS层就进行初步的清洗和过滤,而另一些则将更多的数据加工留在DWD层。选择在哪里进行清洗取决于企业的技术规范和需求。在实际开发中,大多数企业会在将数据存入ODS时进行基本处理,以减少后续工作量。
数据来源可按时间进行分区存储,通常以日为粒度,也有公司采用年、月、日三级分区以优化存储效率。数据在进入数据仓库前进行基础清洗,如格式错误数据的剔除、关键信息缺失的过滤等,以保证数据质量。数据可分为实时和离线两种处理模式。
离线数据通常通过定时任务(如每日批量任务)从业务系统或数据库中抽取。典型的日计算任务会在凌晨执行,通过SeaTunnel、DataX或WhaleTunnel从业务数据库提取数据,计算前一天的业务指标,并生成报表。Hive、Spark常用于批量计算,计算结果存储于Hive、HBase、MySQL、Elasticsearch或Redis等系统中,供后续分析使用。
实时数据源主要来自日志埋点数据或业务数据库,常用于实时推荐、用户画像等业务需求。Spark Streaming和Flink负责实时计算,结果通常写入Elasticsearch、HBase或Redis。实时数据源可利用WhaleTunnel监控MySQL的Binlog变化,将数据实时写入Kafka或HDFS。
在实际应用中,可根据需求选择增量、全量或拉链存储方式。
增量存储通常按天分区,以业务日期为分区字段,每日存储新增的业务数据。例如,用户A在1月1日访问了店铺B,生成记录t1,并于1月2日访问店铺C,生成记录t2。增量存储会将t1存入1月1日的分区,将t2存入1月2日的分区。如果用户A在1月1日购买商品B(生成t1记录)并在1月2日退货(更新t1记录),增量存储会将初始购买记录存于1月1日分区,退货更新后的记录则存于1月2日分区。
对于交易日志和行为日志等高频变更的数据表,增量存储能减少存储成本和数据冗余。下游分析需求一般只需聚合后的汇总数据,因此不需要长期保存全量的历史数据。
全量存储以日为分区,每个分区记录当天的完整业务数据快照。例如,1月1日,卖家A发布了商品B和C,生成记录t1和t2。1月2日,卖家A下架商品B并上架商品D,此时商品B记录t1会更新,商品D生成新记录t3。全量存储会在1月1日分区保存t1和t2,在1月2日分区保存更新后的t1、t2和t3。
对于数据量较小、变化缓慢的维度数据(如商品分类),全量存储能够保证数据完整性和易用性。
拉链存储通过在表中增加开始时间(start_dt)和结束时间(end_dt)两个时间戳字段,记录每次数据变更,并以时间为分区字段。这种方式适用于记录所有变更数据的历史快照,为分析数据演变过程提供支持。
目前WhaleTunnel已经支持了CDC、增量和全量数据抽取模式,也支持自定义插入规则,是用户使用的快速工具。
缓冲层(也称接口层或Stage层)用于存储每天的增量和变更数据。该层暂存从源系统采集的原始数据,以便后续数据处理和ETL流程的使用。
数据通常通过Kafka直接接入缓冲层,对于包含update、delete和insert操作的业务表,会每日生成变更日志;而仅有insert操作的业务表,则直接将数据进入明细层。
建议方案:Apache SeaTunnel或WhaleTunnel生成的CDC日志直接进入缓冲层。如果业务涉及拉链数据,同样将其存放于缓冲层,以确保数据变更的准确记录。
缓冲层的日志数据以Impala外部表形式存储,采用Parquet文件格式。这种方式不仅提高了存储效率,还便于MapReduce等处理引擎对数据的快速访问和处理。
对于日志数据,通常只保留最近几天的数据以节省存储空间。
建议方案:考虑长期存储重要日志数据,以便于历史数据回溯和审计。
通常按天分区数据,以partitioned by时间字段进行存储。这样不仅简化了数据管理,还能提升查询效率。表的Schema设计遵循源系统的结构,以确保数据的一致性和完整性。
在缓冲层中使用Hive的外部表管理数据,外部表的文件可以存储在非默认的HDFS路径中,这样当删除表定义时,实际存储文件不会被删除,保障数据安全。
业务表使用Hive的内部表,当删除表定义时,关联的HDFS文件也会被删除。此方式适合临时或不重要的数据存储,避免重要数据的误删。
数据仓库层设计
DW,Data Warehouse
数据仓库层(DW层)是数据仓库设计的核心层,负责对来自贴源层(ODS层)的数据进行主题化建模,以支持高效的业务分析和决策。DW层根据业务主题划分领域,为各主题构建清晰的数据视图,过滤掉无关决策的数据,专注于支持企业关键分析。在该层,通常会存储业务系统的所有历史数据,例如保存10年以上的数据,为BI系统提供全面的历史数据支持。
在DW层中,主要存储三类数据:
DW层通常进一步划分为三个子层:维度层(DIM)、明细数据层(DWD)和汇总数据层(DWS),并使用维度建模方法为数据设计结构,以确保高效的数据管理和访问:
DW层采用维度建模,将维度表和事实表建立外键关联关系,以减少数据冗余、提高数据的组织效率。维度模型不仅简化了业务分析的复杂性,还提升了DW层的数据易用性。在汇总数据层中,通过宽表设计将不同统计维度关联,建立高度复用的公共指标数据层,从而减少下游数据开发的重复劳动。
维度层以业务维度为建模核心,根据每个维度的业务语义,定义维度属性和关联关系,形成标准化的数据分析维表。此层通过为各维度添加属性、定义关联关系等,明确计算逻辑,实现一致性的数据描述。为了避免在维度模型中出现冗余数据,维度表通常采用雪花模型结构,通过拆分属性表来减少数据重复,实现更加规范的维度建模。
明细数据层以具体的业务过程为核心进行建模,旨在捕捉业务活动的最细粒度信息,构建详细的事实表。这些事实表保留了业务过程的每一个细节,确保数据的完整性和精准性。在实际设计中,对于一些关键的属性字段,可以适当进行冗余处理,即采用宽表化设计,以提升查询效率,减少多表关联带来的性能开销。这种做法在确保数据精细化的同时,兼顾了系统的易用性和高效性。
汇总数据层(DWS)以分析主题为核心进行建模,围绕业务指标需求,构建标准化的汇总表,为上层应用提供一致的公共指标。这一层基于宽表设计,将统计逻辑物理化,确保数据的命名规范和口径一致,从而支持高效的分析查询。汇总数据层包含多种主题的宽表和明细事实表,为业务提供统一的统计视角。
主题域:以业务过程为视角,将业务活动进行抽象和分类。例如,下单、支付、退款等事件可归类为不同的业务主题域,主要针对公共明细层(DWD)进行主题划分。
数据域:以分析需求为导向,将业务过程和维度进一步抽象,形成数据域。数据域划分在公共汇总层(DWS)中进行,用于满足各类业务分析需求。
汇总数据层在数据服务和分析场景中发挥关键作用。主要对ODS和DWD层的数据进行轻度聚合和汇总,确保数据粒度适用于业务需求,支持复杂分析和快速响应上层查询需求。
公共维度层(DIM)通过维度建模来构建企业的一致性维度,以确保在数据分析和计算过程中口径统一,避免因算法或指标不一致而引发的偏差。维度层的主要目的是定义和标准化数据分析的基本属性,例如国家代码、地理位置、产品分类等。通过为所有业务共享的维表建立统一的结构和命名规范,DIM层成为业务数据的标准参照层。
主题域的划分逻辑可以基于不同的业务需求或部门需求:
主题域划分不必一次性完成,可采用迭代方式,从确定的主题开始逐步扩展,最终形成符合行业标准的主题模型。

数据明细层(DWD)是数据仓库和业务系统间的隔离层,主要用于提升数据的质量和一致性,确保存储的数据符合分析需求。DWD层接收并清洗来自ODS层的原始数据,通过去噪、去重、脱敏等处理后,生成干净、准确的明细数据表,以支持业务分析。该层还会适度进行维度退化处理,将一些必要的维度字段直接存储在事实表中,以减少表关联,提高查询性能。
DWD层的数据需要符合严格的数据质量标准,数据在装入前进行多种处理:
DWD层以业务过程为核心进行建模,根据每个业务过程(如下单、支付、退款等)的特点,构建最细粒度的事实表。这些明细事实表保留了业务过程的全部细节,且一般会将一些常用的维度字段冗余存储,采用宽表设计以提升性能。这些事实表也被称为“逻辑事实表”。
DWD层的数据粒度与ODS层保持一致,但在此基础上提供更严格的数据质量保证。DWD层还会适度进行维度退化,例如将商品类别的多级维度(如一级、二级、三级类别)或时间、地域等常用维度直接存储在事实表中,简化关联,提高数据的使用效率。
总结来说,DWD层在保持细粒度的前提下,提供规范化、清洗后的明细数据,为上层的业务应用和分析提供了干净、标准化的数据支撑。这一层的优化和处理不仅提升了数据仓库的性能,还显著降低了数据冗余,提高了数据的可用性和易用性。

( item_id BIGINT COMMENT '商品ID', item_title STRING COMMENT '商品名称', item_price DOUBLE COMMENT '商品价格', item_stuff_status BIGINT COMMENT '商品新旧程度_0全新1闲置2二手', item_prov STRING COMMENT '商品省份', item_city STRING COMMENT '商品城市', cate_id BIGINT COMMENT '商品类目ID', cate_name STRING COMMENT '商品类目名称', commodity_id BIGINT COMMENT '品类ID', commodity_name STRING COMMENT '品类名称', buyer_id BIGINT COMMENT '买家ID')COMMENT '交易商品信息事实表'PARTITIONED BY (ds STRING COMMENT '日期')LIFECYCLE 400;


此表设计为按天分区,数据存储生命周期为400天,用于存储每日更新的商品交易信息。通过ds字段管理数据的时间分区,便于查询和管理。
·END·
白鲸开源是一家开源原生的商业公司,是国家高新技术企业,由多个Apache Foundation Member成立,80%员工都是 Apache Committer,运营2个全球Apache开源项目(, SeaTunnel)。白鲸开源已根据全球最佳实践发布商业版产品WhaleStudio(含白鲸数据调度平台和白鲸数据集成平台WhaleTunnel)。我们致力于打造下一代开源原生的DataOps 平台,助力企业在大数据和云时代,智能化地完成多数据源、多云及信创环境的数据集成、调度开发和治理,以提高企业解决数据问题的效率,提升企业分析洞察能力和决策能力。
了解更多

国内某头部理财服务提供商基于白鲸调度系统建立统一调度和监控运维
白鲸调度系统助力国内头部券商打造国产信创化 DataOps 平台
白鲸开源 DataOps 平台助力证券行业实现信创数字化转型
最佳实践 | 从迁移到Apache DolphinScheduler
Apache DolphinScheduler VS WhaleScheduler
代立冬:基于Apache Doris+WhaleTunnel 实现多源实时数据仓库解决方案探索实践
驾驭数据的未来:WhaleStudio与DataOps的完美结合
运营开源项目

点个在看你最好看
