Hive起源于Facebook,Facebook公司有着大量的日志数据,而Hadoop是实现了MapReduce模式开源的分布式并行计算的框架,可轻松处理大规模数据。然而MapReduce程序对熟悉Java语言的工程师来说容易开发,但对于其他语言使用者则难度较大。因此Facebook开发团队想设计一种使用SQL语言对日志数据查询分析的工具,而Hive就诞生于此,只要懂SQL语言,就能够胜任大数据分析方面的工作,还节省了开发人员的学习成本。
数据仓库是一个面向主题的、集成的、随时间变化的,但信息本身相对稳定的数据集合,它用于支持企业或组织的决策分析处理,这里对数据仓库的定义,指出了数据仓库的三个特点。
(1)数据仓库是面向主题的。
操作型数据库的数据组织是面向事务处理任务,而数据仓库中的数据是按照一定的主题域进行组织,这里说的“主题”是一个抽象的概念,它指的是用户使用数据仓库进行决策时关心的重点方面,一个主题通常与多个操作型信息系统相关。例如,商品的推荐系统就是基于数据仓库设计的,商品的信息就是数据仓库所面向的主题。
(2)数据仓库是随时间变化的。
数据仓库是不同时间的数据集合,它所拥有的信息并不只是反映企业当前的运营状态,而是记录了从过去某一时间点到当前各个阶段的信息。可以这么说,数据仓库中的数据保存时限要能满足进行决策分析的需要(如过去的5~10年),而且数据仓库中的数据都要标明该数据的历史时期。
(3)数据仓库相对稳定。
数据仓库是不可更新的。因为数据仓库主要目的是为决策分析提供数据,所涉及的操作主要是数据的查询,一旦某个数据存入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,修改和删除操作很少,通常只需要定期的加载、刷新来更新数据。
多学一招:OLTP和OLAP
数据处理大致可以分为两类,分别是联机事务处理(OLTP)和联机分析处理(OLAP),其中:
(1)OLTP是传统关系数据库的主要应用,主要针对的是基本的日常事务处理,例如,银行转账。
(2)OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果,例如,商品的推荐系统。
接下来,通过一张表来比较OLTP和OLAP,具体如表所示。
对比项目 OLTP OLAP 用户 操作人员、底层管理人员 决策人员、高级管理人员 功能 日常操作处理 分析决策 DB设计 基于ER模型,面向应用 星型/雪花型模型,面向主题 DB规模 GB至TB ≥TB 数据 最新的、细节的、二维的、分立的 历史的、聚集的、多维的、集成的 存储规模 读/写数条(甚至数百条)记录 读上百万条(甚至上亿条)记录 操作频度 非常频繁(以秒计) 比较稀松(以小时甚至以周计) 工作单元 严格的事务 复杂的查询 用户数 数百个至数千万个 数个至数百个 度量 事务吞吐量 查询吞吐量、响应时间
数据仓库的结构是由数据源、数据存储及管理、OLAP服务器和前端工具四个部分组成。
数据源是数据仓库的基础,即系统的数据来源,通常包含企业的各种内部信息和外部信息。
内部信息,例如存在数据操作数据库中的各种业务数据和自动化系统中包含的各类文档数据;外部信息,例如各类法律法规,市场信息、竞争对手的信息以及外部统计数据和其他相关文档等。
数据存储及管理是整个数据仓库的核心。数据仓库的组织管理方式决定了它有别于传统数据库,同时也决定了对外部数据的表现形式。针对系统现有的数据,进行抽取、清理并有效集成,按照主题进行组织。数据仓库按照数据的覆盖范围可以划分为企业级数据仓库和部门级数据仓库,也就是所谓的数据集市。数据集市可以理解为是一个小型的部门或者工作组级别的数据仓库。
OLAP服务器对需要分析的数据按照多维数据模型进行重组,以支持用户随时进行多角度、多层次的分析,并发现数据规律和趋势。
前端工具主要包含各种数据分析工具、报表工具、查询工具、数据挖掘工具以及各种基于数据仓库或数据集市开发的应用。
在数据仓库建设中,一般会围绕着星状模型和雪花模型来设计数据模型。下面先来介绍这两种模型的概念。
在数据仓库建模中,星状模型是维度建模中的一种选择方式。星状模型是由一个事实表和一组维度表组合而成,并且以事实表为中心,所有的维度表直接与事实表相连。
在上图中,所有的维度表都直接连接到事实表上,维度表的主键放置在事实表中,作为事实表与维度表连接的外键,因此,维度表和事实表是有关联的,然而,维度表与维度表并没有直接相连,因此,维度表之间是并没有关联的。
雪花模型也是维度建模中的另一种选择,它是对星型模型的扩展。
雪花模型是当有一个或多个维表没有直接连到事实表上,而是通过其他维表连到事实表上,其图解像多个雪花连在一起,故称雪花模型。雪花模型是对星型模型的扩展,原有的各维表可被扩展为小的事实表,形成一些局部的 "层次 " 区域,被分解的表都连主维度表而不是事实表。
多学一招:什么是事实表和维度表
1.事实表
每个数据仓库都包含一个或者多个事实数据表,事实表是对分析主题的度量,它包含了与各维度表相关联的外键,并通过连接(Join)方式与维度表关联。
事实表的度量通常是数值类型,且记录数会不断增加,表规模迅速增长。例如,现存在一张订单事实表,其字段Prod_id(商品id)可以关联商品维度表、TimeKey(订单时间)可以关联时间维度表等。
2.维度表
维度表可以看作用户分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息。
维度表包含帮助汇总数据的特性的层次结构,维度是对数据进行分析时特有的一个角度,站在不同角度看待问题,会有不同的结果。例如,当分析产品销售情况时,可以选择按照商品类别、商品区域进行分析,此时就构成一个类别、区域的维度。维度表信息较为固定,且数据量小,维度表中的列字段可以将信息分为不同层次的结构级。
Hive是建立在Hadoop文件系统上的数据仓库,它提供了一系列工具,能够对存储在HDFS中的数据进行数据提取、转换和加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的工具。Hive定义简单的类SQL查询语言(即HQL),可以将结构化的数据文件映射为一张数据表,允许熟悉SQL的用户查询数据,允许熟悉MapReduce的开发者开发mapper和reducer来处理复杂的分析工作,与MapReduce相比较,Hive更具有优势。
Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处,MySQL与Hive对比如下所示。
对比项 | Hive | MySQL |
---|---|---|
查询语言 | Hive QL | SQL |
数据存储位置 | HDFS | 块设备、本地文件系统 |
数据格式 | 用户定义 | 系统决定 |
数据更新 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
执行延迟 | 高 | 低 |
可扩展性 | 高 | 低 |
数据规模 | 大 | 小 |
Hive是底层封装了Hadoop的数据仓库处理工具,运行在Hadoop基础上,其系统架构组成主要包含4部分,分别是用户接口、跨语言服务、底层驱动引擎及元数据存储系统。
下面针对Hive系统架构的组成部分进行讲解。
(1)用户接口:主要分为3个,分别是CLI、JDBC/ODBC和Web UI。其中,CLI即Shell终端命令行,它是最常用的方式。JDBC/ODBC是Hive的Java实现,与使用传统数据库JDBC的方式类似,Web UI指的是通过浏览器访问 Hive 。
(2)跨语言服务(Thrift Server):Thrift 是 Facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务。Hive集成了该服务,能让不同的编程语言调用 Hive 的接口。
(3)底层的驱动引擎:主要包含编译器(Compiler),优化器(Optimizer)和执行器(Executor),他们用于完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成,生成的查询计划储存在 HDFS 中,并在随后由MapReduce调用执行。
(4)元数据存储系统(Metastore):Hive的元数据通常包含表名、列、分区及其相关属性,表数据所在目录的位置信息,Metastore默认存储在自带的Derby数据库中。由于Derby数据库不适合多用户操作,并且数据存储目录不固定,不方便管理,因此,通常都将元数据存储在MySQL数据库。
Hive建立在Hadoop系统之上,因此Hive底层工作依赖于Hadoop服务,Hive底层工作原理如下所示。
接下来,针对图中的 Hive 和 Hadoop之间的工作进程进行简单说明。
(1)UI 将执行的查询操作发送给Driver执行。
(2)Driver 借助查询编译器解析查询,检查语法和查询计划或查询需求。
(3)编译器将元数据请求发送到 Metastore。
(4)编译器将元数据作为对编译器的响应发送出去。
(5)编译器检查需求并将计划重新发送给Driver。至此,查询的解析和编译已经完成。
(6)Driver将执行计划发送给引擎执行 Job任务。
(7)执行引擎从DataNode上获取结果集,并将结果发送给 UI 和 Driver。
Hive中所有的数据都存储在HDFS中,它包含数据库(Database)、表(Table)、分区表(Partition)和桶表(Bucket)四种数据类型。
下面针对Hive数据模型中的数据类型进行介绍。
(1)数据库:相当于关系数据库中的命名空间(namespace),它的作用是将用户和数据库的应用,隔离到不同的数据库或者模式中。
(2)表:Hive的表在逻辑上由存储的数据和描述表格数据形式的相关元数据组成。表存储的数据存放在分布式文件系统里,如HDFS。Hive中的表分为两种类型,一种叫作内部表,这种表的数据存储在 Hive数据仓库中;一种叫作外部表,这种表的数据可以存放在Hive 数据仓库外的分布式文件系统中,也可以存储在 Hive 数据仓库中。值得一提的是,Hive 数据仓库也就是HDFS中的一个目录,这个目录是Hive数据存储的默认路径,它可以在Hive的配置文件中配置,最终也会存放到元数据库中。
(3)分区:分区的概念是根据“分区列”的值对表的数据进行粗略划分的机制,在Hive存储上的体现就是在表的主目录(Hive的表实际显示就是一个文件夹)下的一个子目录,这个子目录的名字就是定义的分区列的名字。
分区是为了加快数据查询速度设计的,例如,现在有个目志文件,文件中的每条记录都带有时间戳。如果根据时间来分区,那么同一天的数据将会被分到同一个分区中。这样的话,如果查询每一天或某几天的数据就会变得很高效,因为只需要扫描对应分区中的文件即可。
注意:分区列不是表里的某个字段,而是独立的列,根据这个列查询存储表中的数据文件。
(4)桶表:简单来说,桶表就是把“大表”分成了“小表”。把表或者分区组织成桶表的目的主要是为了获得更高的查询效率,尤其是抽样查询更加便捷。桶表是 Hive数据模型的最小单元,数据加载到桶表时,会对字段的值进行哈希取值,然后除以桶个数得到余数进行分桶,保证每个桶中都有数据,在物理上,每个桶表就是表或分区的一个文件。
Hive 的安装模式分为3种,分别是嵌入模式、本地模式和远程模式。下面针对这3种模式进行介绍。
(1)嵌入模式:使用内嵌的Derby数据库存储元数据,这种方式是Hive的默认安装方式,配置简单,但是一次只能连接一个客户端,适合用来测试,不适合生产环境。
(2)本地模式:采用外部数据库存储元数据,该模式不需要单独开启 Metastore服务,因为本地模式使用的是和 Hive在同一个进程中的Metastore服务。
(3)远程模式:与本地模式一样,远程模式也是采用外部数据库存储元数据。不同的是,远程模式需要单独开启 Metastore服务,然后每个客户端都在配置文件中配置连接该Metastore 服务。远程模式中,Metastore 服务和 Hive 运行在不同的进程中。
本地和远程模式安装配置方式大致相同,本质上是将Hive默认的元数据存储介质由自带的Derby数据库替换为MySQL数据库。
MySQL前面已经安装过了。这里不在赘述。
下载地址:https://dlcdn.apache.org/hive/
将hive安装包解压到/export/servers/目录下
tar zvxf apache-hive-3.1.2-bin.tar.gz -C /export/servers/
把hadoop安装包下的guava复制到删除的文件目录下
cp guava-27.0-jre.jar /export/servers/apache-hive-3.1.2-bin/lib/
由于 Hive 安装包 conf 目录下,没有提供 hive-site.xml 文件,这里需要创建并编辑一个 hive-site.xml 配置文件,具体内容如下所示:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value> jdbc:mysql://hadoop001:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8value>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>20bigdatavalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>Bigdata2022!value>
property>
configuration>
由于使用的是MySQL数据库,那么就需要上传MySQL连接驱动的 jar 包到 Hive 安装包lib文件夹下。
bin/schematool -initSchema -dbType mysql -verbose
初始化成功会在mysql中自动创建hive数据库和74张表
Hive CLI是Hive的交互工具,下面演示几种 CLI 的使用。
#/bin/hive
hive> exit;
hive> quit;
hive> show tables;
hive> show functions;
hive> !clear;
由于使用CLI连接方式不能进行多个节点的同时访问,而且会造成服务器阻塞,且出于对服务器安全性的考虑, Hive服务所部署的服务器通常用户是无法直接访问的,因此,必须选用远程服务启动模式,具体启动步骤如下。
首先,将hadoop001服务器安装的 Hive 程序分别复制到 hadoop002 和 hadoop003服务器上,具体命令如下:
scp -r /export/servers/apache-hive-3.1.2-bin/ hadoop002:/export/servers/
scp -r /export/servers/apache-hive-3.1.2-bin/ hadoop003:/export/servers/
<property>
<name>hadoop.proxyuser.root.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.usersname>
<value>*value>
property>
分发到hadoop002和hadoop003上
scp /export/servers/hadoop-3.1.4/etc/hadoop/core-site.xml hadoop002:/export/servers/hadoop-3.1.4/etc/hadoop/
scp /export/servers/hadoop-3.1.4/etc/hadoop/core-site.xml hadoop003:/export/servers/hadoop-3.1.4/etc/hadoop/
在hadoop001上启动 Hiveserver2 服务,具体命令如下:
bin/hiveserver2
执行完上述命令后,在hadoop001服务器上就已经启动了 Hive 服务,当前的命令窗口没有任何反应,无法执行其他操作,如下图所示:
此时,可以使用 SecureCRT 软件的克隆会话功能(右击会话窗口,单击 Clone Session 选项)打开新的 hadoop001会话窗口,使用 Jps命令可以查看 Hive 服务启动情况,如下图所示。
在 hadoop002服务器的 Hive安装包下,通过远程连接命令 bin/beeline 进行连接,并且输入连接协议,然后根据提示输入 Hive 服务器的用户名和密码,即可连接到 Hive 服务,具体指令如下:
//输入远程连接命令
bin/beeline
//输入远程连接协议,连接到指定 Hive 服务 (hadoop001)的主机名和端口(默认为10000)
beeline>! connect jdbc:hive2://hadoop001:10000
//输入连接 Hive 服务器的用户名和密码
Enter username for jdbc:hive2://hadoop001:10000: root
Enter password for jdbc:hive2://hadoop001:10000:
在hadoop002服务器执行 show databases后,可以成功显示数据仓库的列表信息,说明远程连接 Hive 成功。
小提示:在连接 Hive 数据仓库进行相关操作时,会使用到数据库(如MySQL),还会依赖 MapReduce 进行数据处理,所以在进行 Hive 连接前,必须保证 Hadoop 集群以及第三方数据库 MySQL 已经启动,否则,在连接过程中会出现拒绝连接的错误提示。