陈新房 刘义卿
(防灾科技学院信息工程学院,河北 廊坊 065201)
1990 年,比尔·恩门(Bill Inmon)第一次提出了数据仓库概念,与结构化数据库不同的是,数据仓库研究和解决如何从数据库中获取信息的问题,数据仓库的基本特征表现为是一个用户主题域的、集成统一的、稳定性较强的、反映历史变化的数据的集合,为管理层进行分析决策(Decision Making Support)提供强有力的支撑。就重要功能而言,数据仓库仍然是对联机事务处理(OLTP)长时间以来产生的海量大数据,通过数据仓库组件特有的数据储存结构,进行系统的、全面的分析与整理,以便通过不同的方法如联机分析处理(OLAP)等进行分析处理。同时,随着数据挖掘(Data Mining) 技术、决策支持系统(Decision-making Support System, DSS)、主管资讯系统 (Excutive Information System)的创建,通过数据仓库操作能够帮助决策者从大量数据中,快速高效的分析提取出有价值的信息,以利与决策制定以及对外部环境的变化租出响应。数据仓库体系结构如图1 所示。
图1 数据仓库体系结构
Hive 的实现是基于Hadoop 生态系统的,通过Hive 工具,可以对数据进行提取、转化、加载等操作,能够对存储在Hadoop 集群中的海量数据进行存储、查询和分析的操作机制。设计Hive工具的主要目的是使得对Java 编程技能掌握相对较弱但是对SQL 技能比较精通的数据分析师对存储在HDFS 中的海量数据进行查询功能操作。
Hive 工具将数据文件映射成一张数据库表,通过类SQL 语言即HiveQL 语言的查询功能,数据分析师通过编写相对精通的HiveQL 语句,即可实现MapReduce 任务的功能。这一特性使得Hive 十分适合对大规模数据存储、统计、分析、查询操作,由于是部署在Hadoop 平台之上,因而具有良好的扩展性。Hive 的优点是相对简单易学,可以快速通过类似SQL 语句实现MapReduce 统计功能,可以大幅提高开发效率。
HiveQL 的设计只是降低了学习成本,其实质仍然是MapReduce 任务的实现。在此,再次强调,Hive 工具本身是数据仓库,而不是结构化的数据库系统,二者的主要区别如表1 所示。
表1 Hive 与数据库的区别
Hive 的体系结构可以分为以下几部分:
2.1 用户可以通过三种接口实现Hive 的操作,分别是CLI、Client 以及WUI(Web User Interface)等接口。最常用的实现方式是CLI,这种借口形式启动CLI 接口同时会启动一个Hive 副本。利用Client 模式可以实现用户连接至Hive Server,这种形式需要指出Hive Server 所安装的节点,在该节点上将启动Hive Server 起来。顾名思义,WUI 接口形式是用户通过浏览器实现Hive 的操作。
2.2 处于Hive 核心位置是驱动程序,由解释器、编译器、优化器三部分组成,通过驱动程序将HiveQL 语句进行词法分析、语法分析、编译、优化以及生产查询计划,进一步将生成的查询计划存储在集群中,随后转换为MapReduce 任务执行完成。
2.3 与此同时,Hive 也有结构化数据库,如MySQL、derBy 数据库,这种结构化数据表存储的是数据表的元数据,包括数据表名称、列(字段)、分区以及是否为外部表、数据所在目录等信息。如图2 所示。
图2 Hive 系统架构
虽然Hive 与结构化数据库有很大区别,但是在数据类型方面,Hive 有着与结构化数据库相同的基本数据类型,同时具有结构化数据库不具有集合数据类型。
选择数据类型时,需要考虑的因素主要有两个方面:一是文本文件中数据类型如何表示的,二是需要考虑数据存储过程中为了提高存储、计算性能问题以及其他问题是否具备可以替代的方案。
相比与结构化数据库,Hive 具有一个独特的功能就是文件中数据的编码方式具有非常大的灵活性。如表2、3 所示。
表2 Hive 的基本数据类型
表3 Hive 的集合数据类型
简单来说,Hive 就是基于Hadoop 平台上的数据仓库。在Hadoop 平台上层设计了一个类SQL 接口(即HiveQL)作为查询接口,可以将HiveQL 装换为MapReduce 任务在Hadoop 平台上运行实现。数据分析人员可以通过HiveQL 语言实现对海量数据的统计、分析、查询操作,而不需要使用编程语言(例如Java)编写MapReduce 程序进行实现。下面以常见的Group By 操作为例介绍实现过程。
现有一个数据分组Group By 操作,要求是将Score 表中的数据信息进行合并,合并的过程按照rank 与level 构成的组合键进行操作,计算出在每一个rank 和level 的组合键值下数据记录的条数,不难写出其sql 语句为:
select rank, level ,count (*) as value from score group by rank, level
对于group by 操作转换为MapReduce 的过程如图3 所示。
图3 HSQL 语句转换成MapReduce 的基本原理
在此举一个实例实践操作Hive 数据分析过程。现有一个300000 行用户信息的数据信息,将其上传到分布式系统中,并利用数据仓库Hive 工具进行数据分析。
在HDFS 上创建数据存储目录,将数据上传到HDFS 分布式文件系统中,并显示其前10 行内容。
这是存储在HDFS 文件系统中的数据,不能进行数据分析、清晰以及提取等操作,需要通过MapReduce 编程或Hive 实现对数据分析。但是MapReduce 要求数据分析人员对编程实现要求较高,实现较复杂,Hive 工具解决了这一难题,为精通SQL 语言而编程能力较弱的数据分析师对存储在集群中的大规模数据进行查询操作提供了便利。
在Hive 数据仓库中创建了外表并且加载数据后,就可以通过HSQL 语言进行数据分析操作了。
①利用Hive 语句,查询前20 位用户购买商品时的时间和购买的商品种类。
2014-12-12 5232
②查询出uid 不重复的数据有多少条。
hive>select count(distinct uid) from bigdata_user;
OK
270
此查询编写Mapreduce 实现过程至少70 行代码,在此不在赘述。
对数据分析完后,可以通过Sqoop 工具将其由Hive 导出到MySQL 结构化数据库中,已方便使用者进行分析、存储以及可视化等操作,各省消费用户数如图4 所示。
图4 各省消费用户数
总结,本文首先介绍了数据仓库的概念,进而引入Hive 数据仓库工具,设计Hive 工具的主要目的是使得对Java 编程技能掌握相对较弱但是对SQL 技能比较精通的数据分析师对存储在HDFS 中的海量数据进行查询功能操作进行论述,并介绍了Hive 的数据类型以及HiveQL转换为MapReduce 任务的过程。最后利用HiveSQL 对300000行用户信息进行数据分析操作,充分表明Hive 在数据分析上的特点,并将数据结果导出进行可视化。