健壮的数据仓库项目搭建
数据仓库是伴随着企业信息化发展起来的,在企业信息化的过程中,随着信息化工具的升级和新工具的应用,数据量变的越来越大,数据格式越来越多,决策要求越来越苛刻,数据仓库技术也在不停的发展。
在进行数据仓库搭建介绍之前,先来简单分析一下数据项目和应用项目的区别。
前期调研阶段
应用项目聚焦业务本身,需要梳理具体的业务流程;数据项目聚焦于数据流向,需要梳理数据全景图。
数据存储
对于建模阶段,应用项目多遵循三范式,多有物理主外键,常使用数据库自身事务保证数据一致性;数据项目建模多采用维度建模,基本不使用物理主外键,数据一致性由ETL保证。
开发过程
应用项目的模型相对简单,可以实现快速迭代;数据项目模型复杂,需要构建底层模型后,再进行快速迭代,见效时间会长于应用项目,通常数据项目需要对底层建模完成,并且对应的数据清洗处理后,才可以进行需求的快速迭代响应。
通常搭建一个健康的数据仓库项目,有业务确认、数据收集、数据建模、数据处理、数据可视化/分析五部分。
一、业务确认
哪些数据为维度数据,哪些数据为事实数据 数据的生产者、使用者以及数据的管理者 业务边界
二、数据收集
数据的定义,要确定主数据以及事实数据的具体业务含义,以及对于事实数据的统计口径进行确认。 数据的更新频率,实时更新还是每日更新或是按需更新等。 数据的更新方式,增量更新还是半全量更新或是全量更新等。 数据的逻辑主键,对于数据的逻辑主键需要和业务方进行确认,根据经验在和业务方确认完成粒度后需要拿到部分数据(维度数据最好全量,事实数据为近一个月数据),对数据进行检查,如逻辑主键是否有空,是否有重复等情况。事实证明,我经常会接触到数据的展现形式和业务方提供的逻辑主键有出入,因此这部分工作建议一定要做,避免后续会有返工。 维度数据质量检查,需要确认数据是否包含关键字段,同时,需要对一些通用信息的关联进行检查,如省市信息,需要和业务沟通省市信的来源(国家统计局/百度/…),再和相应的来源进行校验确认数据质量。 事实数据质量检查,事实数据的质量检查主要为和主数据是否可以完全关联,如果有关联不上的主数据,需要确认原因。 数据范围确认,基于所提供的demo数据来确认是否和上述确认的业务边界匹配。
三、数据建模
1. 概念建模阶段
自上而下创建数据模型,精确的描述业务组织,构想业务的总体结构,并给出主题领域的信息。由实体类型和关系组成。在这个过程中,未声明主键,未指定实体属性。在概念建模阶段,从数据全景出发,而不是局限于现有数据,这样有利于数仓的数据架构扩展。
2. 逻辑建模阶段
逻辑模型定义实体的数据结构和实体之间的关系,在此过程需要定义业务主键和逻辑主键,规范化实体属性,以及细化实体之间的关联关系,同时定义数据源。
3. 物理建模阶段
通过数据库规则,将逻辑模型实例化为物理数据模型。物理数据模型可能与逻辑数据模型不同,根据数据仓库的存储介质不同,需要对物理模型进行相应的优化。
注意:在数据仓库项目中,物理表可以存在逻辑主键,但是不要存在物理主键和物理外键,数据完整性和一致性需要通过ETL保证。
四、数据处理
1. 数据分层
2. ETL流程
§ 通常会在维度数据中插入ID为-1的数据,该数据的目的在于和主数据关联不上的事实数据,在进行后续统计时,采用inner join可以把关联不上主数据的事实数据也统计上(inner join比left join的性能好,因此在大数据量情况下采用inner join进行数据分析等操作)。 § 对于区域和时间等主数据信息,需要进行维护。如区域信息,需要维护不同来源的数据(国家统计局/百度/腾讯…),这样对不同区域来源的数据关联采用相同的区域数据,确保后续关于地区数据的口径统一。时间数据的维护如对于某一天需要记录该日期数据当前年的第几天、当前周的第几天,当前年的第几周等信息,方便后续和事实数据关联后能快速分析。
3. 日志监控
§ job错误
通常是指调度工作出现异常,如azkaban的job调度错误,导致ETL执行失败。针对这类错误的监控,azkaban自带了SLA,可以对每个job进行配置,设定告警邮件和触发条件等。
§ ETL错误
ETL在执行过程中由于代码或数据的异常导致ETL报错。针对这类错误,需要通过代码来定时监控的ETL是否正常工作。
§ 数据错误
数据错误则是数据仓库需要处理的异常数据,该数据为通过质量校验后存入error表中的数据。通常这些数据会导致报表的数据质量,因此需要邮件相关数据的管理者来对数据进行确认处理。
五、数据可视化/分析
小结
§ 数据跟随业务在不断变化,分散的存储和管理由于时效性和各系统的侧重点不同,而无法保证数据一致性,系统对接会造成大量的沟通成本。 § 源系统的数据更新频率导致数据问题频发。 § 业务需求不断变化,模型修改时间过长。
§ 数据建模:数据仓库项目中最重要的一环,决定了是否健壮,是否性能优越,是否易扩展,是否易使用,主要分为概念建模、逻辑建模、物理建模三个阶段,一般采用维度建模中的星型模型,在这个阶段需要梳理数据全景图,考虑已存在和未存在的数据,标识数据源,查看数据质量。 § 架构选型:参考数据源,数据量,性能要求等指标,选择适合的数据存储,ETL工具和报表工具。 § 日志运维:数据的事务、ETL的幂等性由数据日志控制。日志分为任务调度、ETL、数据三个级别。任务调度的日志由调度器维护,例如,Azkaban。ETL的日志,需要记录内部每个模块和ETL的整体运行情况。数据日志记录每个批次运行的数据范围,每个批次运行后的数据结果,例如:维度表的错误处理,事实表每次处理的数据量、成功量、失败量、失败的原因等。运维人员一站式查看、处理ETL运行情况,日志驱动数据流向,每个数据层有对应的日志表,生成本层需要处理的数据范围并记录状态,且层与层之间解耦。