大数据-221 离线数仓分层实战:ODS/DWD/DWS/DIM/ADS 怎么划,数据集市如何避免数据孤岛

74 阅读14分钟

TL;DR

  • 场景:部门自建数据集市越多,口径不一、接口不通,形成数据孤岛,查数成本爆炸。
  • 结论:用“分层 + 一致性维度 + 可复用汇总层”控复杂度;ER 适合稳态大组织,维度模型更适合敏捷交付。
  • 产出:一套离线数仓分层定义(ODS→DW→ADS)+ 建模方法对比 + 常见故障速查卡。

大数据-221 离线数仓分层实战:ODS/DWD/DWS/DIM/ADS 怎么划,数据集市如何避免数据孤岛

离线数仓 架构图

数据集市

数据仓库(DW)是一种反映主题的全局性数据组织,但全局性数据仓库往往太大,在实际应用中他们按部门或业务分别建立反映各个子主题的局部性数据组织,即数据集市(Data Mart),有时也称它为数据仓库。 数据集市:是按照主题域组织的数据集合,用于支持部门级的数据分析与决策。如在商品销售的数据仓库中可以建立多个不同主题的数据集市:

  • 商品采购数据集市
  • 商品库存数据集市
  • 商品销售数据集市

数据集市仅仅是数据仓库的某一部分,实施难度大大降低,并且能够满足企业内部部分业务部分的迫切需求,在初期获得了较大的成功。但随着数据集市的不断增多,这种架构的缺陷也逐步显现。企业内部独立建设的数据集市由于遵循不同的标准和建设原则,以至于多个数据集市的数据混乱和不一致,形成众多的数据孤岛。

数据孤岛现象详解

随着企业业务的不断扩展,组织架构通常会划分为多个事业部门(Business Unit)。例如,一个大型零售企业可能分为电商事业部、线下零售事业部、供应链事业部等。每个事业部门在运营过程中都会产生大量业务数据,包括销售记录、库存信息、客户资料等。

数据孤岛的形成原因

  1. 独立的数据存储系统

    • 各部门往往使用不同的数据库系统(如电商用MySQL,财务用Oracle)
    • 数据格式不统一(如日期格式有YYYY-MM-DD和MM/DD/YYYY之分)
    • 命名规范不一致(如客户ID字段可能被命名为cust_id、customerID或client_no)
  2. 部门壁垒

    • 缺乏跨部门数据共享机制
    • 出于数据安全考虑而设置的访问限制
    • 部门间的竞争关系导致数据保护主义
  3. 技术障碍

    • 系统架构不兼容(如部分使用云服务,部分使用本地服务器)
    • 缺乏统一的数据接口标准
    • 历史遗留系统的技术债务

数据孤岛的具体表现

以零售企业为例:

  • 电商事业部掌握的客户网购行为数据无法与线下门店的会员数据打通
  • 供应链部门的库存数据无法实时同步给销售部门
  • 市场营销部门的活动效果数据难以与财务部门的ROI分析关联

数据孤岛的负面影响

  1. 决策效率低下

    • 管理层无法获取完整的业务视图
    • 需要人工整合多份报告才能做出决策
  2. 运营成本增加

    • 重复的数据采集和清洗工作
    • 需要维护多个独立的数据系统
  3. 客户体验受损

    • 无法实现跨渠道的个性化服务
    • 客户在不同部门需要重复提供相同信息
  4. 创新受阻

    • 难以开展跨部门的数据分析项目
    • 无法充分挖掘数据的潜在价值

典型场景示例

场景:客户投诉处理

  • 客服部门:记录投诉内容,但无法查看该客户的历史订单数据
  • 售后部门:处理退换货,但不知道客户之前的咨询记录
  • 质量部门:分析产品问题,但缺乏完整的客户反馈数据

这种情况导致客户问题需要多次转接,处理周期长,客户满意度下降。

建模方法

数据模型就是数据组织和存储方法,它强调业务、数据存取和使用角度合理存储数据。有了适合的基础数据存储环境的模型,能获得以下好处:

  • 性能:良好的数据模型能够帮助我们快速查询所需要的数据,减少数据的I/O吞吐
  • 成本:良好的数据模型能极大的减少不必要的数据冗余,也能实现计算结果复用,极大的降低数据系统中的存储和计算成本。
  • 效率:良好的数据模型能极大的改善使用使用数据的体验,提高使用数据的效率
  • 质量:良好的数据模型能够改善数据统计口径不一致性,减少数据计算错误的可能性。

大数据系统需要数据模型的方法来帮助更好的组织和存储数据,以便在性能、成本、效率和质量之间取得最佳的平衡。

ER模型

数据仓库之父Bill Inmon提出的建模方法是从全企业的高度设计一个3NF模型,用实体关系(Entity RelationShip,ER)模型描述企业业务,在范式理论上符合3NF。数据仓库中的3NF与OLTP系统中的3NF的区别在于,它是站在企业角度面向主题的抽象,而不是针对某个具体业务流程的实体对象的抽象。其具体有以下几个特点:

  • 需要全面的了解整个企业业务和数据
  • 实施周期非常的长
  • 对建模人员的能力要求非常高

采用ER模型建设数据仓库模型的出发点是整合数据,将各个系统中的数据以整个企业角度按主题进行相似性组合和合并,并进行一致性处理,为数据分析决策服务,但是并不能直接用于分析决策,其建模步骤分为三个阶段:

  • 高层模型:一个高度抽象的模型,描述主要的主题以及主题间的关系,用于描述企业的业务总体概况
  • 中层模型:在高层模型的基础上,细化主题的数据项
  • 物理模型(也叫底层模型):在中层模型的基础上,考虑物理存储,同时基于性能和平台特点进行物理属性的设计,也可能做一些表的合并、分区的设计等等

维度模型

维度模型是数据仓库领域的Palph Kimball 大师所倡导的,他的《数据仓库工具箱》是数据仓库工程领域最流行的数据仓库建模经典。 维度模型从分析决策的需求出发构建模型,为分析需求服务,重点关注用户如何更快的完成需求分析,同时具有较好的大规模复杂查询的响应性能。其典型的代表是星型模型,以及在一些特殊场景下的雪花模型。 其设计主要分为以下步骤:

  • 选择需要进行分析决策的业务过程,业务过程可以是:单个业务事件,比如交易的支付、退款的。某个事件的状态,比如当前的账户余额等。一系列相关业务事件组成的业务流程。
  • 选择数据的粒度,在事件分析中,我们要预判所有分析需要细分的程度,从而决定选择的粒度。
  • 识别维表,选择好粒度之后,就需要基于此粒度设计维度表,包括维度属性,用于分析时进行分组和筛选。
  • 选择事实,确定分析需要衡量的指标

现代企业业务变化快、人员流动频繁、业务知识功底不够全面,导致ER模型设计产出周期长。大多企业实施数据仓库的经验说明:在不太成熟、快速变化的业务面前,构建ER模型的风险非常大,不太适合去构建ER模型。而维度建模对技术要求不高,快速上手,敏捷迭代,快速交付,更快速完成分析需求,有较好的大规模复杂查询的响应性能。

数仓分层

数据仓库更多代表的是一种对数据的管理和使用的方式,它是一整套包括了数据建模、ETL(数据抽取、转换、加载)、作业调度等在内的完整的理论体系流程。数据仓库在构建过程中通常需要进行分层处理。业务不同,分层的技术处理手段也不同。 分层的主要原因是在管理数据的时候,能对数据有一个更加清晰的掌控。详细来讲,主要有下面几个原因:

  • 清晰的数据结构:每一个数据分层都有它的作用域,在使用表的时候能更方便的定位和理解。
  • 将复杂的问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的问题,比较简单和容易理解,而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的地方开始修复。
  • 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够极大减少重复计算
  • 屏蔽原始数据的异常:屏蔽业务的影响,不必改一次业务就重新接入数据
  • 数据血缘的追踪:最终给业务呈现的是一个能直接使用业务表,但是它的来源很多,如果有一张来源表出问题了,借助血缘最终能够快速准确的定位到问题,并清楚它的危害范围。

数仓的常见分层一般为3层,分别为:

  • 数据操作层
  • 数据仓库层
  • 应用数据层(数据集市层)。

当然根据研究人员经验或者业务,可以分为更多不同的层,只要能达到流程清晰,方便查数即可。

离线数仓 整体架构图

ODS

ODS(Operation Data Store 数据准备区),数据仓库源头系统的数据表通常会原封不同的存储一份,这称为ODS层,也称为准备区。它们是后续数据仓库加工数据的来源。ODS层数据的主要来源包括:

  • 业务数据库,可用DataX、Sqoop等工具来抽取,每天定时抽取一次,在实时的应用中,可用Canal监听MySQL Binlog,实时接入变更的数据。
  • 埋点日志,线上系统会打入各种日志,这些日志一般以文件的形式保存,可以用Flume定时抽取
  • 其他数据源,从第三方购买的数据,或是网络爬虫的数据

DW

DW(Data WareHouse 数据仓库层),包含DWD、DWS、DIM层,由ODS层数据加工而成,主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标。

  • DWD(Data WareHouse Detail 细节数据层),是业务与数据仓库的隔离层,以业务过程为建模驱动,基于每个具体的业务过程特点,构建细粒度的明细层事实表。可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当地冗余,也即宽表化处理。
  • DWS(Data WareHouse Service 服务数据层),基于DWD的基础数据,整合汇总成分析某个主题域的服务数据。以分析的主题为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表。
  • 公共维度层(DIM):基于维度建模理念思想,建立一致性维度
  • TMP层:临时层,存放计算过程中临时产生的数据

ADS

ADS(Application Data Store)应用数据层,基于DW数据,整合汇总成主题域的服务数据,用于提供后续的业务查询等。

简单总结

数据仓库层次的划分不是固定不变的,可以根据实际需求进行适当裁剪或者是添加,如果业务相对简单和独立,可以将DWD、DWS进行合并。

离线数仓 ADS ETL

错误速查

症状根因定位修复方案
同一个指标在不同报表数值不一致口径分散在各数据集市/各团队脚本里,维度不一致、过滤条件不一致拉齐指标定义:统计周期、去重规则、状态过滤;对比各表 SQL/ETL 逻辑差异;指标上收:沉到 DWS 公共粒度汇总层;统一 DIM 维度与主键映射;禁止 ADS 私自改口径
反复做相同清洗/Join,任务链越来越长分层边界不清,ODS/DWD 直接服务上层;缺少可复用中间层看 DAG:相同 Join/过滤在多个任务重复出现;看数据血缘同源多产出;抽公共逻辑到 DWD(明细事实)或 DIM(一致性维度);DWS 提供公共粒度汇总复用
查数慢、扫描量巨大明细层粒度过细且无分区/无宽表策略;维度表设计不合理看执行计划:全表扫描、Shuffle 过大;看分区字段是否命中;DWD 按业务过程定粒度并分区;适度宽表化;维度表拆分热字段与低频字段
业务一改字段/逻辑,上层大面积重跑ODS 未做“原始留存 + 变化隔离”;上游异常直接污染 DW比对 ODS 原始与 DWD 清洗后差异;检查字段变更是否有兼容层;ODS 只做原样落地与最小规范化;在 DWD 做稳定抽象;新增过渡字段与兼容视图
维度口径混乱:同一客户在不同系统 ID 不同主数据缺失,缺少一致性维度(DIM)与映射表抽样核对:订单、会员、CRM 等系统的 ID 映射覆盖率;建立统一主键(surrogate key)与映射表;DIM 维护生命周期与 SCD 策略(慢变维)
ADS 表越来越多、像“另一个数仓”ADS 承担了建模与加工职责,越权看 ADS 是否包含复杂 Join/清洗/口径计算;ADS 只做面向应用的轻度整合与出数;重加工回收至 DW(DWD/DWS/DIM)
临时 TMP 表长期存在、口径不可追溯TMP 被当成正式产出,缺少治理与生命周期查元数据:TMP 存活时间、引用链、是否有 owner;TMP 设 TTL 与命名规范;引用必须落到 DWD/DWS;纳入血缘与质量校验

其他系列

🚀 AI篇持续更新中(长期更新)

AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南! AI研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地

💻 Java篇持续更新中(长期更新)

Java-218 RocketMQ Java API 实战:同步/异步 Producer 与 Pull/Push Consumer MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务已完结,Dubbo已完结,MySQL已完结,MongoDB已完结,Neo4j已完结,FastDFS 已完结,OSS已完结,GuavaCache已完结,EVCache已完结,RabbitMQ已完结,RocketMQ正在更新... 深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解