01 hive 介绍与安装

教程 阿布都的都 ⋅ 于 2023-01-06 19:04:46 ⋅ 422 阅读

1 hive介绍与原理分析

​ Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据。它是Facebook 2008年8月开源的一个数据仓库框架,提供了类似于SQL语法的HQL(hiveSQL)语句作为数据访问接口。

1.1 hive的优缺点

优点:

1)Hive 使用类SQL 查询语法, 最大限度的实现了和SQL标准的兼容,大大降低了传统数据分析人员处理大数据的难度

2)使用JDBC 接口/ODBC接口,开发人员更易开发应用;

3)以MR 作为计算引擎、HDFS 作为存储系统,为超大数据集设计的计算/ 扩展能力;

4)统一的元数据管理(Derby、MySql等),并可与Pig 、spark等共享;

元数据:hive表所对应的字段、属性还有表所对应存储的HDFS目录。

file

缺点:

1)Hive 的HQL 表达的能力有限,比如不支持UPDATE、非等值连接、DELETE、INSERT单条等;

insert单条代表的是 创建一个文件。

2)由于Hive自动生成MapReduce 作业, HQL 调优困难;

3)粒度较粗,可控性差,是因为数据是读的时候进行类型的转换,mysql关系型数据是在写入的时候就检查了数据的类型。

4)hive生成MapReduce作业,高延迟,不适合实时查询。

1.2 与关系数据库的区别

1)hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;

2)hive使用mapreduce做运算,与传统数据库相比运算数据规模要大得多;

3)关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时性很差;实时性差导致hive的应用场景和关系数据库有很大的区别;

4)Hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个方面要比Hive差很多。

Hive RDBMS
查询语言 HQL SQL
数据存储 HDFS Raw Device or Local FS
执行 MapReduce spark 数据库引擎
数据存储校验 存储不校验 存储校验
可扩展性 有限
执行延迟
处理数据规模

1.3 hive的组成

服务端组件和客户端组件。

file

服务端组件:

Driver组件:该组件包括Complier(编译)、Optimizer(优化)和Executor(执行),它的作用是将HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的MapReduce计算框架。

Metastore组件:元数据服务组件,这个组件存取Hive的元数据,Hive的元数据存储在关系数据库里,Hive支持的关系数据库有Derby和Mysql。作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。

file

Thrift服务:Thrift是Facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,Hive集成了该服务,能让不同的编程语言调用Hive的接口。

客户端组件:

CLI:Command Line Interface,命令行接口。

JDBC/ODBC:Hive架构的JDBC和ODBC接口是建立在Thrift客户端之上。

WEBGUI:Hive客户端提供了一种通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI组件(Hive Web Interface),使用前要启动HWI服务。

1.4 Hive查询的执行过程

file

1)Execute Query:hive界面如命令行或Web UI将查询发送到Driver(任何数据库驱动程序如JDBC、ODBC,等等)来执行。

2)Get Plan:Driver根据查询编译器解析query语句,验证query语句的语法,查询计划或者查询条件。

3)Get Metadata:编译器将元数据请求发送给Metastore(数据库)。

4)Send Metadata:Metastore将元数据作为响应发送给编译器。

5)Send Plan:编译器检查要求和重新发送Driver的计划。到这里,查询的解析和编译完成。

6)Execute Plan:Driver将执行计划发送到执行引擎。

6.1)Execute Job:hadoop内部执行的是mapreduce工作过程,任务执行引擎发送一个任务到资源管理节点(resourcemanager),资源管理器分配该任务到任务节点,由任务节点上开始执行mapreduce任务。

6.1)Metadata Ops:在执行引擎发送任务的同时,对hive的元数据进行相应操作。

7)Fetch Result:执行引擎接收数据节点(data node)的结果。

8)Send Results:执行引擎发送这些合成值到Driver。

9)Send Results:Driver将结果发送到hive接口。

2 hive 安装

2.1 在linux上安装MYSQL

用root用户安装

1)获取mysql 源安装包

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

file

2)安装mysql 源

rpm -ivh mysql57-community-release-el7-11.noarch.rpm

3)检查mysql源是否安装成功

yum repolist enabled | grep "mysql.-community."

file

3)用 yum 命令安装mysql

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

yum install mysql-community-server

4)修改mysql的配置文件

查看MYSQL配置文件加载顺序:

mysqld --help --verbose|grep -A1 -B1 cnf 

file

修改/etc/my.cnf 配置文件内的文件目录

datadir=/data/mysql/data

sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

log-error=/data/mysql/log/mysqld.log

file

其中:

SQL_MODE:通过对其正确的设置可以完成一些约束检查的工作,设置时,在配置文件my.cnf 中配置进行全局的设置。

STRICT_TRANS_TALES(严格模式):

​ 只对支持事务的表启用严格模式。

NO_AUTO_CREATE_USER:

​ 禁止GRANT创建密码为空的用户。

NO_ENGINE_SUBSTITUTION:

​ 启用后,若需要的存储引擎被禁用或未编译,则抛出错误;未启用时将用默认的存储引擎代替,并抛出一个异常。

5)创建mysql 文件目录

[root@localhost jar]# mkdir -p /data/mysql/data
[root@localhost jar]# mkdir -p /data/mysql/log

6)生成首次登录随机密码

mysqld --initialize

通过上面命令会在 /data/mysql/log/mysqld.log 中生成随机码,随机码用来首次登录mysql。

file

7)修改mysql 文件目录所有者为 mysql 用户

chown -R mysql:mysql /data/mysql

8)启动mysql

systemctl start mysqld.service

9) 关闭并重启mysql(不是必须要执行的)

systemctl stop mysqld.service
systemctl start mysqld.service

如果再次启动报错,就重启Linux 系统。

10)用生成的随机密码登录mysql

mysql -uroot -p'ujkq0>4*/yMD'

登录后进入mysql 命令行

11)修改ROOT用户密码

set password=PASSWORD('12345678'); 

设置完密码后,需要用新密码重新登录

12)卸载mysql(不是必须的)

如果启动报错,根据错误查看原因,如果实在解决不了,卸载mysql 重新装。

查看已经安装过的组件

rpm -qa | grep -i mysql

file

用yum -y remove 卸载所有mysqlyum -y remove mysql57-community-release-el7-11.noarch yum -y remove mysql-community-common-5.7.19-1.el7.x86_64

卸载后再用 rpm -qa | grep -i mysql 查看,直至全部卸载
删除/data/mysql 目录

rm -rf /data/mysql

重启:reboot

再重新安装

2.2 安装hive

1)root 用户上传并解压hive的tar包

rz
#解压到/usr/local/目录下
tar -xzf ./apache-hive-2.1.1-bin.tar.gz -C /usr/local/

file

file

2)创建软链接

ln -s /usr/local/apache-hive-2.1.1-bin /usr/local/hive

file

3)修改/usr/local/hive/apache-hive-2.1.1-bin目录所有者

chown -R hadoop:hadoop /usr/local/apache-hive-2.1.1-bin

file

4)配置环境变量

增加HIVE_HOME和HIVE_CONF_DIR

export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=/usr/local/hive/conf

更新配置

source /etc/profile

5)修改配置

切换到hadoop用户,修改hive配置在/usr/local/hive/conf目录

先备份原来的配置

cp -R /usr/local/hive/conf /usr/local/hive/conf_back

file

上传hive-site.xml 到 /user/local/hive/conf/ 目录下

mv hive-env.sh.template hive-env.sh

mv hive-log4j2.properties.template hive-log4j2.properties

file

6)在mysql中创建hive用的数据库和hive用户

--登录mysql
mysql -uroot -p'12345678'                            
--创建hive用户
CREATE USER 'hive'@'%' IDENTIFIED BY '12345678';   
--在mysql中创建hive_meta数据库
create database hive_meta default charset utf8 collate utf8_general_ci;
--给hive用户增加hive_meta数据库权限
grant all privileges on hive_meta.* to 'hive'@'%' identified by '12345678';
--更新
flush privileges; 

file

7)拷贝mysql驱动jar 到/usr/local/hive/lib/

file

8)删除冲突的log4j

rm -f /usr/local/hive/lib/log4j-slf4j-impl-2.4.1.jar

file

9)在HDFS上创建hive使用的数据目录

hadoop fs -mkdir -p /hive/warehouse

hadoop fs -chmod -R 777 /hive

hadoop fs -ls /hive

10)hive初始化mysql

schematool -dbType mysql -initSchema

file

11)在客户端用hive用户 连接 hive的元数据库hive_meta

file

file

3 启动hive

3.1 hive的三种模式

3.1.1 使用内置的derby数据库做元数据的存储

​ 使用内置的derby数据库做元数据的存储,操作derby数据库做元数据的管理,使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,目录不同时元数据也无法共享,不适合生产环境只适合练习。

3.1.2 本地模式

​ 使用mysql做元数据的存储,操作mysql数据库做元数据的管理,可以多个hive client一起使用,并且可以共享元数据。但mysql的连接信息明文存储在客户端配置,不便于数据库连接信息保密和以后对元数据库进行更改,如果客户端太多也会对mysql造成较大的压力,因为每个客户端都自己发起连接。

file

安全角度:metastore存储mysql连接的数据库信息,driver和 metastore在一台机器上,数据库信息不安全。

当多台机器的Driver 、 metastore都指向一个mysql 时,mysql的压力会增大。

启动的时候, 只需要启动metastore就可以。

3.1.3 远程模式

​ 使用mysql做元数据的存储,使用metastore服务做元数据的管理,优点便于元数据库信息的保密,因为只需要在运行metastore的机器上配置元数据库连接信息,客户端只需要配置metastore连接信息即可,缺点会引发单点问题,例如metastore服务挂了,其它hive终端就获取不到元数据信息了。企业环境推荐使用此种模式。

file

安全角度:meta从hive的driver上分离出来,在单独的机器上, 这样数据库的连接信息会安全。

启动时,需要分别启动driver和metastore

本地模式和远程模式的区别是

1)本地模式不安全,远程模式安全。

2)本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。

远程模式需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。

服务端指的是Metastore服务所在的机器,即安装metastore的机器

metastore服务端配置

file

file

3.2 启动hive

配置完成之后,先启动matesotre服务,再启动hive client

# 启动zookeeper、hdfs、yarn、代理、历史
# 启动metastore
nohup hive --service metastore > /dev/null 2>&1 &
# 启动hive客户端
hive

nohup & 的知识

file

file

4 测试hive

1)创建库

# 创建数据库
create database hainiu;
# 显示建库语句
show create database hainiu;
# 进入数据库
use hainiu;

file

数据库在hdfs的位置

file

2)新建表

如果想在某个数据库下创建表,首先进入数据库(use 数据库名),

如果没有进入数据库,那默认是default

# 创建user_info 数据表
create table user_info(id int,name string);
# 查看表结构
desc user_info;
# 查看建表语句
show create table user_info;

file

3)上传测试数据

默认'\001'分割,vim中输入方法ctrl+v ctrl+a

file

 #上传文件到user_info 表的目录下
 hadoop fs -put word.txt /hive/warehouse/hainiu.db/user_info

4)测试查询

select * from user_info;

file

insert 一条语句,执行mapruduce,在表里创建一个文件

file

file

5 hive的数据组织

基本概念和关系型数据库类似,如:库,表,列,分区。按照数据组织粒度由大到小说明:

1)数据库 Databases Database起到命名空间的功能,避免表,视图等定义的混乱,同时也为权限的定义及分配提供良好的隔离。在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹。

file

2)表 Tables 每个表包含一个主题信息,有多个属性字段组成的二维数据集合,一个数据库可以包含多张表。
在hdfs中表现为db目录下的一个文件夹。

file

3)分区 Partitions 每个表可以有一个或多个分区键值,是数据的存储单元,可以按分区key划分查询数据范围,有效提高查询效率。比如可以按月和按天设计表分区,查询是指定查某天则不需要扫描整月数据。
在hdfs中表现为table目录下的子目录 。

4)桶 Buckets 表分区还可以按照某几列hash进行划分,是更细粒度的数据范围。桶表就是对应不同的文件。

在HDFS中表现为table/分区/00000_0…0000N_0。

student 表
id  name    age
1   name1   10
2   name2   10
3   name3   11
4   name4   11
普通表:
/hive/warehouse/hainiu.db/student/f1.txt
select count(*) from student where age=10;
扫描:/hive/warehouse/hainiu.db/student
分区表:
/hive/warehouse/hainiu.db/student/10/10岁的数据文件
                                 /11/11岁的数据文件

select count(*) from student where age=10;
扫描:/hive/warehouse/hainiu.db/student/10
分区好处:不需要扫描全表
桶表:
桶:是文件更细粒度的划分。会根据某个字段的数据,划分多个文件,每个文件就算一个桶
数据放到哪个桶里,可以通过hash(字段数据) % 桶的个数 来决定放到哪个桶。
当抽样时,可以直接扫描某个桶,不需要扫描全表。
/hive/warehouse/hainiu.db/student
id  name    age
1   name1   10
2   name2   10
3   name3   11
4   name4   11
5   name5   11
6   name6   12
把上面的6条数据,按照name字段的数据分2桶
按照hash(name字段的数据) % 2个桶, 看放在哪个桶里。

6 元数据库中相关表的解释

---------------------------------------------------------------------

file

-- 数据库信息 (数据库id,数据库名称,数据库对应的hdfs存储位置)
select * from DBS;
-- 数据表信息(数据表id,数据库id,存储id,表名)
select * from TBLS;
-- 存储信息   (存储id,表对应的hdfs存储位置)
select * from SDS;
-- 数据库和表的关系
select t1.`NAME`, t1.DB_LOCATION_URI, t2.TBL_NAME 
from DBS t1, TBLS t2 
where t1.DB_ID=t2.DB_ID and t1.`NAME` like 'hai%';

select t1.`NAME`, t1.DB_LOCATION_URI, t2.TBL_NAME 
from DBS t1 
inner join TBLS t2
on t1.DB_ID=t2.DB_ID and t1.`NAME` like 'hai%';
-- 数据表和存储的关系
select t1.TBL_NAME, t2.LOCATION from TBLS t1, SDS t2 
where t1.SD_ID=t2.SD_ID and t1.TBL_NAME = 'user_info';
-- 数据库、表、存储的关系
select t1.`NAME`, t2.TBL_NAME, t3.LOCATION from DBS t1, TBLS t2 , SDS t3 
where t1.DB_ID=t2.DB_ID and 
            t2.SD_ID = t3.SD_ID AND
            t1.`NAME` = 'hainiu' AND
      t2.TBL_NAME = 'user_info' ;

执行结果:

file

file

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-阿布都的都,http://hainiubl.com/topics/76050
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter