数据仓库
数据仓库与业务系统数据库
数据仓库
- 面向主题 (业务类型:如机器,用户,歌曲,营收)
- 集成 (从多数据源抽取数据后按一致、无歧义的格式写入数据仓库)
- 随时间变化 (存放历史数据,保留快照)
- 非易失 (写入数据仓库后不再修改删除)
- 粒度 (数据装载的时间周期,日增量、日全量、日汇总、月全量等,粒度越低数据量越大,保留信息越多)
业务系统
- 安全性:统计分析与业务分离
- 变更频繁:重写分析系统、重新测试
- 难以建立和维护源于多个业务系统的报表
- 不同的数据源数据格式不统一
- 业务数据库为事务处理性能优化,不适合查询分析
- 统计分析影响业务系统性能
使用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模式