美文网首页
数据仓库

数据仓库

作者: 千反田爱瑠爱好者 | 来源:发表于2018-08-22 11:39 被阅读12次

    数据仓库与业务系统数据库

    数据仓库

    • 面向主题 (业务类型:如机器,用户,歌曲,营收)
    • 集成 (从多数据源抽取数据后按一致、无歧义的格式写入数据仓库)
    • 随时间变化 (存放历史数据,保留快照)
    • 非易失 (写入数据仓库后不再修改删除)
    • 粒度 (数据装载的时间周期,日增量、日全量、日汇总、月全量等,粒度越低数据量越大,保留信息越多)

    业务系统

    • 安全性:统计分析与业务分离
    • 变更频繁:重写分析系统、重新测试
    • 难以建立和维护源于多个业务系统的报表
    • 不同的数据源数据格式不统一
    • 业务数据库为事务处理性能优化,不适合查询分析
    • 统计分析影响业务系统性能

    使用Hadoop

    传统数据仓库

    • 失信的SLA:数据处理时间越来越长
    • 不堪重负的数据仓库:ETL处理与用户查询竞争资源,体验变差
    • 高昂的成本:节约成本把数据归档后难以查询时间窗口以外的数据
    • 缺乏灵活性:需求变更模式改动大,结构化数据与其他数据源难以关联

    Hadoop优势

    • 减少对EDW资源占用
    • 提供数据访问接口
    • 在线归档数据
    • 灵活的模式演进,半结构化、非结构化数据处理
    • 可通过Oozie等工作流管理工具协调调度

    Sqoop(操作型数据源系统)、Flume/Kafka(日志等)-> HDFS -> Hive/Impala/Spark/HBase
    <-> Sqoop(EDW)
    <-> 分析工具

    术语

    模型

    • 维度模型:事实表 + 维表(星型模型)
    • 规范化模型:遵循关系型数据库三大范式

    粒度:事实表粒度大小(一条记录代表什么),应尽可能细小;

    可加性:字段是否可以直接相加(指标),计数或者求平均值(维度);

    事实表:拥有一或多个外键(参考维表,如订单表的城市ID),主键为一系列外键的组合(唯一标识一条记录);

    聚合事实表:为了加速查询而构建的事实表聚合(如每天订单平均金额);

    维表:各种查询约束(如省份城市表),及报表标签源头;

    日历维度:附加在大多数的事实表和一些维表上;

    缓慢变化的维度:把已存在的旧值修改为新的值(机器基本信息表),要么使用新值添加一条新的记录,并将其标记为当前值,将旧的标记为废弃(机器基本信息历史表);

    架构设计

    数据建模与存储

    选择存储引擎::取决于数据访问方式

    • HDFS:从OLTP系统提取数据,批量处理(整个时间周期数据、批处理效率更高)后加载到数据仓库,或者全表扫描;
    • HBase:随机访问,即席查询;

    反范式设计:为分析提速(Hadoop不适合进行多次关联操作,尤其是较大的事实表关联较小的维表:比如处理时订单表应直接写入机器信息而非ID,避免查询时机器信息表再与订单表关联),也避免维护多个数据集的繁琐,缺点是:带来数据冗余,数据采集流水线变得繁琐,数据更新困难;

    数据更新:HDFS不支持原地更新,而且即使加上处理逻辑原地更新后也无法追踪更新流水记录

    事实表:根据更新时间取日增量每天同步追加(如订单收益取生成时间,订单退款取更新时间同步到事实表,即可计算净收益同时追踪变化,如有需要还可以另外维护一个订单全量表记录订单最新状态信息);
    历史表:根据更新时间取日全量每天同步(完整的用户表,同时最新的一份可以作为状态表);

    存储格式及压缩算法

    • Avro:行式存储,支持模式演进,不需要根据OLTP修改ETL操作(适合追加);
    • Parquet:列式存储,性能强大(涉及多个维表的事实表较宽,查询和聚合操作只涉及小部分列),压缩支持好;
    • 不推荐CSV(出于性能、压缩和模式管理考虑,CSV访问时还需要数据解析)
      压缩算法推荐使用Snappy

    分区方式:取决于数据访问方式,目的是跳过不必要的数据;按时间周期分区分区平均大小为HDFS数据块的若干倍(典型值为每天数据1GB则按天分区,较多则按小时,较少则按周或月)

    数据采集

    OLTP导出:Sqoop,Informatica,Pentaho,Kettle
    对象:数据几乎不变的表(一次性导入),数据频繁更新的小表(日全量),数据频繁更新且无法每天全量提取的大表(日增量,周/月全量)

    数据整合:Sqoop导出时执行关联(可以仅插入、仅更新和混合,但只支持简单的条件,而且关联操作会给OLTP带来压力;Sqoop同时支持元数据服务,可记录上次执行状态,下次执行时可以使用保证获取更新的记录)
    导出到HDFS后再作关联(Spark、Hive)

    数据处理与访问

    分区

    • 对已存在表分区(从旧表读取数据,并将数据加载到新创建的、带分区的表的正确分区中);
    • 将数据加载到表的多个分区中;
    • 将导入某个目录的数据作为新的分区添加到表中

    合并、更新:除了记录事实表,还要维护已有信息表(缓慢变化的维表等),可以全量导入,也可以从已有信息读出、追加修改后再重新写入,并更新元数据(如果有的话);

    提高更新效率:只针对分区修改、添加Hadoop节点、改用HBase(如果更新频繁的话,但也会渐慢查询速度)

    数据聚合

    Hadoop支持在关系型数据库中执行很耗资源的聚合操作(求和、计数、平均,天然高度并行),使用Hive、Spark、Impala,聚合后的数据集通过Sqoop导出到关系型数据库,可再接入BI工具继续处理。

    数据导出

    • 将数据保留在Hadoop 中,使用Impala (更低延迟)、Hive和集成的BI工具进行查询;
    • 与关系型数据库集成:Informatica、Pentaho,Sqoop + Oracle连接器

    流程调度

    • Oozie(开源),Autosys、Activebatch 以及UC4

    • Oozie工作流的关键几点(中间两步都可以由Spark完成):

      • 一个用于获取数据的Sqoop操作
      • 一个用于执行数据集关联、分区、合并的Hive操作
      • 多个用于完成聚合的Hive或MapReduce操作
      • 一个用于将结果导出至数据仓库的 Sqoop 操作
    • 多组步骤时采用fork-and-join模式

    相关文章

      网友评论

          本文标题:数据仓库

          本文链接:https://www.haomeiwen.com/subject/pnbeiftx.html