Hive介绍和安装

139 阅读16分钟

#博学谷IT学习技术支持#

数据仓库的介绍

数据仓库的基本概念

数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库顾名思义,是一个很大的数据存储集合,出于企业的分析性报告和决策支持目的而创建,对多样的业务数据进行筛选与整合。它为企业提供一定的BI(商业智能)能力,指导业务流程改进、监视时间、成本、质量以及控制。

数据仓库的输入方是各种各样的数据源,最终的输出用于企业的数据分析、数据挖掘、数据报表等方向。

数据仓库是面向主题的(Subject-Oriented )、集成的(Integrated)、稳定的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理决策。

1.主题性

不同于传统数据库对应于某一个或多个项目,数据仓库根据使用者实际需求,将不同数据源的数据在一个较高的抽象层次上做整合,所有数据都围绕某一主题来组织。

这里的主题怎么来理解呢?比如对于城市,“天气湿度分析”就是一个主题,对于淘宝,“用户点击行为分析”就是一个主题。

2.集成性

数据仓库中存储的数据是来源于多个数据源的集成,原始数据来自不同的数据源,存储方式各不相同。要整合成为最终的数据集合,需要从数据源经过一系列抽取、清洗、转换的过程。

3.稳定性

数据仓库中保存的数据是一系列历史快照,不允许被修改。用户只能通过分析工具进行查询和分析。这里说明一点,数据仓库基本上是不许允许用户进行修改,删除操作的。大多数的场景是用来查询分析数据。

4.时变性 (月 、季度、年) 流式处理:亚秒级,秒级、毫秒级

数据仓库会定期接收新的集成数据,反应出最新的数据变化。这和稳定特点并不矛盾。

数据仓库与数据库区别

数据库(面向事务)

数据库是面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理,也被称为联机事务处理 OLTP(On-Line Transaction Processing)。

数据仓库

数据仓库一般针对某些主题的历史数据进行分析,支持管理决策,又被称为联机分析处理 OLAP(On-Line Analytical Processing)。

首先要明白,数据仓库的出现,并不是要取代数据库。

两者区别

  • 数据库是面向事务的设计,数据仓库是面向主题设计的。
  • 数据库一般存储业务数据,数据仓库存储的一般是历史数据。
  • 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
  • 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

以银行业务为例。数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。

数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。

显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。

  • 数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。

  数据仓库分层架构

按照数据流入流出的过程,数据仓库架构可分为三层——源数据数据仓库数据应用。

数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。

  • 源数据层(ODS): 操作性数据(Operational Data Store) ,是作为数据库到数据仓库的一种过渡,ODS的数据结构一般与数据来源保持一致,而且ODS的数据周期一般比较短。ODS的数据为后一步的数据处理做准备。
  • 数据仓库层(DW): 数据仓库(Data Warehouse),是数据的归宿,这里保持这所有的从ODS到来的数据,并长期报错,而且这些数据不会被修改,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
  • 数据应用层(DA): 数据应用(Dataapplication),为了特定的应用目的或应用范围,而从数据仓库中独立出来的一部分数据,也可称为部门数据或主题数据,该数据面向应用。如根据报表、专题分析需求而计算生成的数据。

  数据仓库之ETL

ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL是将业务系统的数据经过抽取、清洗、转换之后加载到数据仓库的过程,目的是将企业中分散、零乱、标准不统一的数据整合到一起。

ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。

Hive基本概念

  Hive介绍

  什么是Hive

Hive是一个构建在Hadoop上的数据仓库框架。最初,Hive是由Facebook开发,后来移交由Apache软件基金会开发,并作为一个Apache开源项目。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更进一步可以说hive就是一个MapReduce的客户端。

为什么使用Hive

  • 直接使用hadoop所面临的问题

    • 人员学习成本太高
    • 项目周期要求太短
    • MapReduce实现复杂查询逻辑开发难度太大
  • 为什么要使用**Hive**

    • 操作接口采用类SQL语法,提供快速开发的能力

    • 避免了去写MapReduce,减少开发人员的学习成本

    • 功能扩展很方便

    Hive的特点

  1. Hive最大的特点是通过类SQL来分析大数据,而避免了写MapReduce程序来分析数据,这样使得分析数据更容易。
  1. 数据是存储在HDFS上的,Hive本身并不提供数据的存储功能,它可以使已经存储的数据结构化。
  1. Hive是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如MySQL)。
  1. 数据存储方面:它能够存储很大的数据集,可以直接访问存储在Apache HDFS或其他数据存储系统(如Apache HBase)中的文件。
  1. 数据处理方面:因为Hive语句最终会生成MapReduce任务去计算,所以不适用于实时计算的场景,它适用于离线分析。
  1. Hive除了支持MapReduce计算引擎,还支持Spark和Tez这两种分布式计算引擎;
  1. 数据的存储格式有多种,比如数据源是二进制格式,普通文本格式等等;

  Hive架构

    架构图

基本组成

客户端: Client CLI(hive shell 命令行),JDBC/ODBC(java访问hive),WEBUI(浏览器访问hive)

元数据: Metastore:本质上只是用来存储hive中有哪些数据库,哪些表,表的字段,,表所属数据库(默认是default) ,分区,表的数据所在目录等,元数据默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore。

驱动器:Driver

(1)解析器(SQL Parser):将SQL字符转换成抽象语法树AST,这一步一般使用都是第三方工具库完成,比如antlr,对AST进行语法分析,比如表是否存在,字段是否存在,SQL语句是否有误

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划

(3)优化器(Query Optimizer):对逻辑执行计划进行优化

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划,对于Hive来说,就是MR/Spark

存储和执行: Hive使用HDFS进行存储,使用MapReduce进行计算

Hive与传统数据库对比

总结:hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析

Hive的安装

  Hive的安装方式

hive的安装一共有三种方式 :内嵌模式、本地模式、远程模式

元数据服务(metastore) 作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。

内嵌模式

内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。数据库和Metastore服务都嵌入在主Hive Server进程中。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。

解压hive安装包 bin/hive 启动即可使用

缺点:不同路径启动hive,每一个hive拥有一套自己的元数据,无法共享。

本地模式

本地模式采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用MySQL。

本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。也就是说当你启动一个hive 服务,里面默认会帮我们启动一个metastore服务。

hive根据hive.metastore.uris 参数值来判断,如果为空,则为本地模式。

缺点是:每启动一次hive服务,都内置启动了一个metastore。

远程模式

远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程模式的metastore服务和hive运行在不同的进程里。

在生产环境中,建议用远程模式来配置Hive Metastore。

在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。

远程模式下,需要配置hive.metastore.uris 参数来指定metastore服务运行的机器ip和端口,并且需要单独手动启动metastore服务。

hiveserver2是Hive启动了一个server,客户端可以使用JDBC协议,通过IP+ Port的方式对其进行访问,达到并发访问的目的。


  Hive的安装

我们在此处选择第三台机器node3作为我们hive的安装机器,安装方式使用远程方式。

安装mysql数据库

在这里,我们使用mysql数据库作为Hive的元数据存储,所以在安装Hive之前,必须安装好mysql

注意!!!!!,在安装Mysql之前,给虚拟机保存一个快照,一旦安装失败,可以恢复快照,重新安装!

1、解压mysql安装包

 #将MySQL的安装包提前上传到Linux的/export/software目录 
cd  / export / software
tar  -zxvf mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz -C /export/server/

2、重命名

cd /export/server
mv mysql-5.7.29-linux-glibc2.12-x86_64  mysql-5.7.29

3、添加用户组与用户

groupadd mysql
useradd -r -g mysql mysql

4、修改目录权限

chown -R mysql : mysql /export/server / mysql-5.7.29 / 

5、配置mysql服务

cp /export/server / mysql-5.7.29 / support-files / mysql.server  / etc / init.d / mysql

6、修改mysql配置文件

1)修改/etc/init.d/mysql文件

vim / etc / init.d / mysql

将该文件的basedir和datadir路径修改为以下内容

basedir=/export/server / mysql-5.7.29
datadir=/export/server / mysql-5.7.29 / data

2)修改配置文件my.cnf

修改/etc/my.cnf文件

vim  / etc / my.cnf

将/etc/my.cnf原来的内容全部删除,然后将以下内容复制进去.

 [ client ] port=3306
default-character-set=utf8
 [ mysqld ] basedir=/export/server / mysql-5.7.29
datadir=/export/server / mysql-5.7.29 / data
port=3306
character-set-server=utf8
default_storage_engine=InnoDB

7、初始化mysql

/export/server / mysql-5.7.29 / bin / mysqld --defaults-file=/ etc / my.cnf --initialize --user=mysql --basedir=/export/server / mysql-5.7.29 --datadir=/export/server / mysql-5.7.29 / data

执行该命令之后,会生成一个mysql的临时密码,这个密码后边要使用。

8、启动服务

service mysql start

9、登录mysql

使用第7步生成的临时密码

/export/server / mysql-5.7.29 / bin / mysql -uroot -p临时密码

请注意,如果回车之后临时密码报错,则可以执行以下指令,然后手动输入临时密码:

/export/server / mysql-5.7.29 / bin / mysql **-**uroot **-**p

10、修改密码

注意这条命令是在登录mysql之后执行

set password=password ( '123456' ); 

11、开启远程访问权限

注意这条命令是在登录mysql之后执行

GRANT ALL PRIVILEGES ON  *.*  TO 'root' @ '%' IDENTIFIED BY '123456' ;  
flush privileges ; 

12、修改环境变量

退出mysql,然后修改Linux的/etc/profile文件

vim / etc / profile

在该文件末尾最后添加以下内容

export MYSQL_HOME=/export/server / mysql-5.7.29
export PATH=$PATH:$MYSQL_HOME/ bin

保存修改之后,让该文件的修改生效

source  / etc / profile

13、将mysql设置为开机启动

chkconfig --add mysql  #mysql服务到自启服务
chkconfig mysql on #设置自启

安装Hive

#--------------------Hive安装配置----------------------
# 上传压缩包到/export/software目录里,并解压安装包
cd  / export / software / tar -zxvf apache-hive-3.1.2-bin.tar.gz -C  / export / server
cd  / export / server
mv apache-hive-3.1.2-bin hive-3.1.2

#解决hadoop、hive之间guava版本差异
cd  / export / server / hive-3.1.2
rm -rf lib / guava-19.0.jar
cp  / export / server / hadoop-3.3.0 / share / hadoop / common / lib / guava-27.0-jre.jar  ./ lib / 
#添加mysql jdbc驱动到hive安装包lib/文件下
mysql-connector-java-5.1.47-bin.jar

#修改hive环境变量文件 添加Hadoop_HOME
cd  / export / server / hive-3.1.2 / conf / mv hive-env.sh.template hive-env.sh

vim hive-env.sh
HADOOP_HOME=/ export / server / hadoop-3.3.0
export HIVE_CONF_DIR=/ export / server / hive-3.1.2 / conf
export HIVE_AUX_JARS_PATH=/ export / server / hive-3.1.2 / lib
export HADOOP_HEAPSIZE=4096

#在/export/server/hive-3.1.2/conf目录下新增hive-site.xml 配置mysql等相关信息
vim hive-site.xml

 < configuration >      <!-- 存储元数据mysql相关配置 -->      < property >          < name > javax.jdo.option.ConnectionURL </ name >          < value >  jdbc : mysql://node3:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8 </ value >       </ property > 
     < property >          < name > javax.jdo.option.ConnectionDriverName </ name >          < value > com.mysql.jdbc.Driver </ value >      </ property > 
     < property >          < name > javax.jdo.option.ConnectionUserName </ name >          < value > root </ value >      </ property > 
     < property >          < name > javax.jdo.option.ConnectionPassword </ name >          < value > 123456 </ value >      </ property > 
     <!-- H2S运行绑定host -->      < property >          < name > hive.server2.thrift.bind.host </ name >          < value > node3 </ value >      </ property > 
     <!-- 远程模式部署metastore 服务地址 -->      < property >          < name > hive.metastore.uris </ name >          < value > thrift://node3:9083 </ value >       </ property > 
     <!-- 关闭元数据存储授权  -->      < property >          < name > hive.metastore.event.db.notification.api.auth </ name >          < value > false </ value >      </ property > 
     <!-- 关闭元数据存储版本的验证 -->      < property >          < name > hive.metastore.schema.verification </ name >          < value > false </ value >      </ property >  </ configuration > 


#添加环境变量
vim  / etc / profile

export HIVE_HOME=/ export / server / hive-3.1.2
export PATH=:$HIVE_HOME/ bin :$PATH 

#让环境变量生效
source  / etc / profile

#初始化metadata(只需要在配置完Hive之后进行一次操作)
cd  / export / server / hive-3.1.2
schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表



#-----------------Metastore 和 Hiveserver2启动----
nohup  / export / server / hive-3.1.2 / bin / hive --service metastore  2>&1  & nohup  / export / server / hive-3.1.2 / bin / hive --service hiveserver2 2>&1  & 

#验证是否安装成功!
在Linux中输入hive命令,直接回车 , 出现一个终端,在该终端中可以输入sql命令 : show databases ; 



#如果hive没有安装成功,则需要做以下操作:
1 检查参数是否有问题
2 杀死两个junjar进程
3 进入mysql删除hive数据库:drop database  hive
4 重新对hive初始化:schematool -initSchema -dbType mysql -verbos

Hive的交互方式

第一种交互方式:bin/hive

hive

创建一个数据库

create database  mytest ; show databases ; 
第二种交互方式:使用sql语句或者sql脚本进行交互

不进入hive的客户端直接执行hive的hql语句

hive -e "create database mytest2"

或者我们可以将我们的hql语句写成一个sql脚本然后执行

cd /export/server
vim  hive .sql

脚本内容如下:

create database mytest3 ; use mytest3 ; create table stu ( id int , name string ); 

通过hive -f 来执行我们的sql脚本

hive -f /export/server/hive .sql
第三种交互方式:Beeline Client

hive经过发展,推出了第二代客户端beeline,但是beeline客户端不是直接访问metastore服务的,而是需要单独启动hiveserver2服务。

1)在node1的/export/server/hadoop-3.3.0/etc/hadoop目录下,修改core-site.xml,在该文件中添加以下配置,实现用户代理:

<property>
 <name>hadoop.proxyuser.root.hosts</name>
 <value> * </value>
</property>
<property>
 <name>hadoop.proxyuser.root.groups</name>
 <value> * </value>
</property>

将修改好的core-site.xml文件分发到node2和node3,然后重启Hadoop(stop-all.sh start-all.sh)

scp core-site.xml node2 :$PWD


scp core-site.xml node3 :$PWD


2)在hive运行的服务器上,确保已经启动metastore服务和hiveserver2服务,如果没有启动,则执行以下语句

nohup /export/server / hive /bin/ hive --service metastore &
nohup /export/server / hive /bin/ hive --service hiveserver2 &

nohup 和 & 表示后台启动

3:在node3上使用beeline客户端进行连接访问。

/export/server/hive-3.1.2/bin/beeline

根据提醒进行以下操作:

 [root@node3 ~]# beeline which: no hbase in (:/export/server/hive-2.1.0/bin::/export/server/hadoop-2.7.5/bin:/export/data/hadoop-2.7.5/sbin::/export/server/jdk1.8.0_241/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/export/server/mysql-5.7.29/bin:/root/bin)
Beeline version 2.1.0 by Apache Hive
beeline>  !connect jdbc:hive2://node3:10000
Connecting to jdbc:hive2://node3:10000
Enter username for jdbc:hive2://node3:10000: root
Enter password for jdbc:hive2://node3:10000:123456

连接成功之后,出现以下内容,可以在提示符后边输入hive sql命令

  Hive一键启动脚本

这里,我们写一个expect脚本,可以一键启动beenline,并登录到hive。expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信。

安装expect

yum  -y install expect

创建脚本

cd /export/server /  hive-3.1.2
vim  beenline.exp

添加以下内容:

#!/bin/expect
spawn beeline 
set timeout 5
expect "beeline>"
send "!connect jdbc:hive2://node3:10000\r"
expect "Enter username for jdbc:hive2://node3:10000:"
send "root\r"
expect "Enter password for jdbc:hive2://node3:10000:"
send "123456\r"
interact

修改脚本权限

chmod 777 beenline.exp

启动beeline

expect beenline.exp