数据仓库建模方法
在数据仓库建模领域有两种主流的建模方法,一种是Inmon提出的依托于OLTP数据库,采用自上而下的建模方法,先对企业级数据仓库进行总体设计,在数据仓库基础之上,根据业务部门的不同需求构建数据集市。另一种是Kimball提出的维度建模,采用自下而上的建模方法,先构建数据集市,然后将多个数据集市整合成一个数据仓库。
目前,这两种建模方法在学术界和工业界都得到了广泛认可,并且在生产环境中已经被大规模应用。这两种建模方法没有好坏之分,用户可以根据公司目前所处阶段、业务复杂度、公司规模等条件选择合适的建模方法。当公司处于早期阶段,公司规模较小,业务发展速度非常快,有可能需要经常调整业务方向。针对这种情况,可以选择使用Kimball的维度建模法,快速地搭建数据仓库,及时响应业务需求。当公司处于稳定阶段,公司属于大中型规模,业务发展稳定,并且已经有了一定的数据积累。针对这种情况,可以选择Inmon的建模方法,从上到下系统地规划设计,这种方法的开发周期比较长,但是一旦搭建成功,后期维护将非常方便。
数据抽取、转换和加载
在构建数据仓库的过程中,需要将各分散数据源中的数据整合在一起,不同数据源的数据格式、字段描述、存储方式等信息各不相同,有些数据中还存在大量的脏数据。数据仓库要求必须是干净的、规范的、一致性的数据才可以被加载到数据仓库中。所以原始数据源的数据要经过抽取、清洗转换之后才会被加载到数据仓库中,这个数据被加工处理的过程称为ETL。
ETL是抽取(Extract)、转换(Transformation)、加载(Load)的简称,目的是将企业中分散、不规范、不一致的数据整合到一起,为后续的统计分析工作提供准确的数据支撑。
ETL不只发生在数据加载进数据仓库之前,在数据仓库各层之间也会涉及ETL。ETL在数据仓库中起着非常重要的作用,决定了最终分析结果的准确性。在构建数据仓库的过程中,ETL会耗费大量的时间,有些公司会专门设置ETL工程师的岗位专门从事ETL工作。
数据统计
数据从业务系统经过ETL进入数据仓库,为后续的数据统计工作提供基础数据。数据工程师基于数据仓库进行数据处理和统计分析工作,最终的统计结果会被导入BI系统为决策者提供数据依据。整个数据处理和统计流程如图9-4所示。
数据统计分析的过程是基于数据仓库中进行的,公司决策者使用的BI系统与数据仓库是两套系统,那么就会涉及统计结果在两个系统之间的传输问题。解决这个问题有三种常用方法。
(1)将统计结果保存到TXT、CSV等数据文件中,然后使用关系型数据库的数据导入工具将数据文件导入BI系统可以访问的关系型数据库表中。
(2)将统计结果保存到数据仓库应用层的数据表中,搭建中间数据服务系统,该系统通过JDBC/ODBC访问应用层数据表中的数据,BI系统通过中间数据服务系统获取相关数据。
(3)如果数据仓库是基于Hadoop/Hive构建的,那么可以将统计结果保存到HDFS的指定目录中,通过Sqoop等工具将存储在HDFS中的结果数据导入BI系统的关系型数据库表中。
数据仓库工具Hive
Hive是一款基于Hadoop的数据仓库解决方案。Hive最初是由Facebook开发的,后来贡献给Apache软件基金会,将其命名为Apache Hive并作为一个独立开源项目。Hive不是一个关系型数据库,不提供数据存储服务,真正的数据存储在Hadoop的分布式文件系统HDFS中。Hive主要负责元数据管理,把研发工程师或数据分析师熟悉的SQL语句转换为Hadoop的分布式处理程序MapReduce,然后将MapReduce程序调度到Hadoop中运行,对存储在HDFS上的大规模数据进行分析处理。
虽然Hive不是一个关系型数据库,但是Hive支持类似关系型数据库中的数据库、表、视图等概念。对于熟悉数据库的用户来说学习成本非常低,可以像操作关系型数据一样使用Hive。Hive提供了一种类SQL的查询语言HiveSQL,它的语法与MySQL的语法非常相似,熟悉MySQL的用户可以非常快速地掌握HiveSQL。
HiveSQL内置了很多常用的运算符和函数,能够满足日常的大部分工作需求。对于HiveSQL中没有提供的函数或用户需要处理的一些个性化需求,可以通过用户自定义函数UDF或用户自定义聚合函数UDAF进行扩展实现。
Hive的架构如图9-5所示。
Hive允许用户通过三种方式访问Hive,分别如下:
(1)通过命令行接口(CLI)交互式地访问Hive,这种方式简单方便。
(2)为了方便用户使用不同编程语言开发的程序访问Hive,Hive提供了跨语言Thrift服务,在程序中通过JDBC或ODBC直接访问Hive。
(3)Hive提供了可视化操作工具HWI,用户可以更加直观地通过试图界面访问Hive。
ETL作业调度
ETL过程会调度大量的作业,在项目初期业务比较简单的阶段,一种比较经典的调度方式是通过Linux系统的crontab调度作业脚本执行调度的,在Linux系统中,用户可以通过编辑crontab文件设置需要定时执行的作业。crontab文件中的一行就是一个待执行的作业,Linux系统通过后台服务进程crond定期检查crontab文件中是否有要执行的任务,从而实现定时自动执行某个任务。
例9-3每天凌晨1点15分执行数据抽取脚本sqoop_import_consumer_address_df.sh,作业执行过程中产生的日志输出到sqoop_import_consumer_address_df.log日志文件中。
使用crontab定时执行作业的优点是操作简单,适合在简单地业务场景下使用。缺点也很明显,在复杂的业务场景下通常需要调度大量的作业,有些作业需要并行执行,有些作业需要前后依赖执行,需要编写大量的脚本控制各个作业的执行流程,需要工程师投入大量的精力维护这些脚本,作业的监控管理也非常不方便。
在复杂的业务场景下,通常会选择使用操作更加灵活、功能更加强大、方便监控管理的开源调度系统或公司内部自研的调度系统进行自动化调度。这种调度方式不但可以周期性地并行执行各种作业,还可以设置复杂的作业之间的依赖关系。工程师可以对作业整个运行流程进行监管,当作业运行失败时会立即向管理员发送报警信息,如果配置了重试机制,那么调度器针对失败的作业还会重新调度执行。常用的开源工作流调度系统有Apache Oozie、Azkaban等。