购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

任务1.2
认识Hive

任务描述

Hive是基于Hadoop的数据仓库,优点是学习成本低,可以通过类SQL语句实现快速MapReduce统计,不必开发专门的MapReduce应用程序,让MapReduce的使用变得更加简单。Hive十分适合用于对数据仓库中的数据进行统计分析。

本任务的目标是使读者了解Hive的起源,掌握Hive的架构与工作原理,认识Hive与传统数据库的区别,并了解Hive的优势。

1.2.1 Hive简介

2007年,Facebook公司(现Meta公司)为了对每天产生的海量网络平台数据进行分析而开发了Hive。翌年,Hive成为Apache软件基金会维护的一个开源项目,并逐渐成为顶级项目。Facebook公司设计开发Hive的初衷是让那些熟悉SQL编程方式的人也可以更好地使用Hadoop。数据分析人员在对存储于HDFS中的数据进行分析与管理时,只关注具体业务模型,不需要使用基于Java开发的MapReduce应用程序,而是通过Hive编写Hive Query Language(简称HQL或HiveQL)语句,再调用底层执行引擎MapReduce完成操作。

在Hadoop中MapReduce的主要工作原理是将计算任务切分成多个小单元,分布到各个节点上执行,从而降低计算成本并提高可扩展性。但是使用MapReduce进行数据处理的人员门槛比较高,对于传统数据库开发、管理运维而言,需具备一定编程语言基础并必须掌握基于Java或Python面向MapReduce的应用程序接口(Application Program Interface,API)。此外,数据存储在HDFS中,并没有Schema(模式)的概念。Schema指的是表里面的列、字段、字段名称、字段与字段之间的分隔符等元素,也称为Schema信息。如果将数据从传统的关系数据库迁移至HDFS进行应用,会产生Schema信息的缺失,此时Hive就成为传统数据架构和Hadoop MapReduce之间的“桥梁”。

1.2.2 Hive的架构

Hadoop生态圈包含若干用于协助Hadoop的不同的子项目(工具)模块,如Sqoop、Pig和Hive。模块的主要用途如下。

(1)Sqoop:用于在HDFS和关系数据库之间导入和导出数据。

(2)Pig:用于开发MapReduce作业的程序语言的工具,通过将PigLatin脚本编译成MapReduce任务来实现数据处理和计算。

(3)Hive:用于开发SQL类型脚本进行MapReduce作业的工具,通过将HQL转换为MapReduce任务来实现数据处理。

同时在Hadoop生态圈中,有多种方法可以执行MapReduce作业。传统的方法是使用Java MapReduce程序处理结构化数据、半结构化数据和非结构化数据。更适用于数据流处理,如数据清洗、ETL(抽取、转换、加载)等。Hive适用于需要使用SQL处理大规模数据集的场景,因为Hive的语法类似于SQL,所以大多数传统的数据分析人员可以很快上手。

Hive定义了简单的类SQL,允许熟悉SQL的用户查询数据。同时,HQL允许熟悉MapReduce的开发者开发自定义的Mapper和Reducer处理内建的Mapper和Reducer无法完成的复杂的分析工作。

Hive的架构如图1-2所示。

图1-2 Hive的架构

Hive包含的主要组件的简要说明如下。

1.访问接口

Hive提供了3种访问接口:命令行接口(Command Line Interface,CLI),Hive Web接口(Hive Web Interface,HWI)以及ThriftServer。具体介绍如下。

(1)CLI

CLI是基础的访问接口,使用“hive”命令访问。CLI启动时会同时启动一个Hive副本,相当于执行“ hive-service cli”命令。启动CLI只需要在命令行中执行“$HIVE_HOME/bin/hive”命令即可。在命令行状态中执行“hive-H”可以查看CLI选项。

(2)HWI

HWI是Hive CLI的Web接入方式。HWI的特点是相对于CLI界面友好,适合不太熟悉Linux命令行操作的数据分析人员。通过浏览器打开“http://主机IP地址:9999/hwi/”网址可访问Hive服务,HWI的默认端口为9999。

(3)ThriftServer

ThriftServer提供客户端通过JDBC(Java Database Connectivity,Java数据库互连)和ODBC(Open Database Connectivity,开放数据库互连)接入数据库的能力,用于进行可扩展跨语言服务的开发。Hive集成了该服务,可以通过不同的编程语言调用Hive的接口。对于Java程序,Hive提供了JDBC驱动;对于其他应用程序,Hive提供了ODBC驱动。

2.元数据存储服务

元数据服务(Metadata)又称中介数据,是描述数据的数据,主要是描述数据的属性信息,用来支持指示存储位置等功能。Hive的元数据存储在关系数据库里,Hive支持的关系数据库有Derby、MySQL等。

Hive中的数据分为两部分,一部分是真实数据,一般存储在HDFS中;另一部分是真实数据的元数据,单独存储在关系数据库(如Derby、MySQL等)中。元数据包含Hive中的数据库、表、表模式、目录、分区、索引以及命名空间等信息,是对真实数据的描述。元数据会不断更新变化,所以不适合存储在HDFS中。实现任何对Hive真实数据的访问均需要先访问元数据。元数据对于Hive十分重要,因此Hive把元数据存储(Metastore)服务独立出来,从而防止Hive服务和Metastore服务耦合,以保证Hive的健壮性。

在默认情况下,Hive会使用内置的Derby数据库,其只提供有限的单进程存储服务,在这种情况下,Hive不能执行两个并发的Hive CLI实例,Derby数据库通常被应用于开发、测试环境中。对于生产环境,需要使用MySQL关系数据库。

3.Driver

Driver是Hive的核心组件。Driver包括的组件及其说明如表1-2所示。

表1-2 Driver包括的组件及其说明

由表1-2可得,Driver的主要功能是将用户编写的HQL语句进行解析、编译、优化,生成逻辑执行计划,并提交给Hadoop集群进行处理。

1.2.3 Hive设计特性

Hive提供了一种比MapReduce更简单、更优化的数据开发方式,越来越多的人开始使用Hive。

1.Hive的特点

Hive可让普通数据库用户从现有的、基于关系数据库和SQL的数据基础架构转移到Hadoop上。对于SQL用户而言,Hive提供了HQL,可用于查询HDFS上的数据,减少开发人员的学习成本,使得开发人员可以使用一种熟悉的语言操作和分析HDFS上的数据。

Hive具有如下特点。

(1)HQL与SQL有着相似的语法,大大提高了开发人员的开发效率。

(2)Hive支持运行在不同的框架上,包括YARN、Tez、Spark、Flink等。

(3)Hive支持HDFS与HBase上的即席查询(Ad-Hoc)。

(4)Hive支持用户自定义的函数、脚本等。

(5)Hive支持JDBC与ODBC,建立了自身与ETL、BI工具的通道。

Hive还具有以下优势。

(1)可扩展。Hive可以自由扩展集群的规模,一般情况下无须重启服务。

(2)可延展。Hive支持用户自定义函数,用户可根据自己的需求来编写自定义函数。

(3)可容错。Hive良好的容错性使得当节点出现问题时HQL语句仍可完成执行。

简而言之,当使用Hive时,操作接口采用类SQL语法,提高了快速开发的能力,避免了编写复杂的MapReduce任务,减少了开发人员的学习成本,而且扩展很方便。

2.Hive的适用场景

Hive构建在基于静态批处理的Hadoop之上,Hadoop通常都有较高的延迟并且在作业提交和调度时需要大量的开销,故Hive有特定的适用场景。

Hive并不能在大数据集上实现低延迟的快速查询,例如,Hive在几百兆字节的数据集上执行查询一般有分钟级的延迟。因此Hive并不适合那些需要低延迟的应用,例如,在联机事务处理(OnLine Transaction Processing,OLTP)中,Hive查询操作过程严格遵守Hadoop MapReduce的作业执行模型,Hive将用户的HQL语句通过解析器转换为MapReduce作业提交到Hadoop集群上,Hadoop监控作业执行过程,然后返回作业执行结果给用户。Hive并非为OLTP而设计,Hive并不提供实时的查询和基于行级的数据更新操作。

Hive的最佳适用场景是大数据集的批处理作业,如网络日志分析。Hive封装了Hadoop的数据仓库工具,使用类SQL的HQL实现数据查询,所有的数据都存储在与Hadoop兼容的文件系统中,如Amazon S3、HDFS。Hive在加载数据过程中不会对数据进行任何修改和添加,只是将数据移动到HDFS中Hive设定的目录下。

3.Hive与传统数据库的区别

在Hadoop诞生前,大部分的数据仓库都是基于关系数据库实现的,而数据仓库应用程序是建立在数据仓库的基础上的数据应用,包括报表展示、即席查询、数据分析、数据挖掘等。数据仓库源自数据库而又不同于数据库,主要区别在于数据仓库适合联机分析处理(OnLine Analytical Processing,OLAP),通常用于对某些主题的历史数据进行分析;而数据库适合OLTP,通常用于在数据库联机时对业务数据进行添加、删除、修改、查询等操作。Hive的早期版本或新版本在默认情况(系统默认状态)下并不支持事务,一般来说并不适合OLTP。

Hive与关系数据库有很多相同的地方,包括查询语言与数据存储模型等。HQL并不完全遵循SQL92标准,如HQL只支持在FROM子句中使用子查询,并且子查询必须有名字。最重要的是,HQL需在Hadoop上执行,而非在传统的数据库上执行。在数据存储模型方面,数据库、表都与传统数据库的概念相同,但Hive中增加了分区和分桶的概念。

Hive与关系数据库也有其他不同的地方,如在关系数据库中,表的Schema在数据加载时就已确定,若不符合Schema则会加载失败;而Hive在加载数据过程中不对数据进行任何验证,只是简单地将数据复制或移动到表对应的目录下。加载数据过程中不对数据进行验证是Hive能够支持大规模数据的基础之一。事务、索引以及更新是关系数据库非常重要的特性,鉴于Hive的设计初衷,事务、索引以及更新特性一开始就不是Hive设计目标。Hive与关系数据库的对比如表1-3所示。

表1-3 Hive与关系数据库的对比

Hive与关系数据库存在较大差异,Hive支持不同的存储类型,如纯文本文件、HBase中的文件;Hive将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间;Hive可以直接使用存储在HDFS中的数据;Hive内置有大量用户函数来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF函数完成内置函数无法实现的操作,同时提供类SQL,将SQL查询转换为MapReduce任务在Hadoop集群上执行。 K0BZM8yMCpO2rWum3OJPj5EulBQbAmQzS8QNkySVvagbaU7Ql9d6YEQt3N66FUNy

点击中间区域
呼出菜单
上一章
目录
下一章
×