Day06_01_Hive数据仓库

Hive数据仓库

一、概述

1、Hive是Hadoop的子项目,后来被独立出来成为了一个Apache的顶级项目

2、Hive是Apache提供的一套基于Hadoop的进行数据仓库管理的工具,提供了读写以及管理海量数据的功能

3、Hive提供了大量的类SQL(Hive QL,简称为HQL)来对Hadoop(HDFS)上的数据进行操作,底层会将HQL语句转

换为MapReduce程序执行,所以适合离线开发

4、Hive可以管理HDFS上的数据,使用表结构的形式来管理HDFS上的数据

5、默认情况下,Hive的元数据信息不是存储在HDFS的,而是存储在Hive自带的Derby文件型数据库中

6、Hive安装完成之后实际开发中通常要替换元数据库,到目前为止Hive只支持Derby和MySQL两种数据库,需要

将Derby替换为MySQL

7、Derby存在的问题:

​ ①Derby数据库是一种文件型数据库,在进入检查的时候当前目录下是否存在metastore.db文件夹,该文件夹

用来存储数据库数据的,如果有则直接使用如果没有就会默认创建一个新的目录,一旦更换目录那么意味着元数据

就丢失了

​ ②Derby数据是一个单用户的数据库,无法支持多用户同时操作,而Hive使用Derby作为元数据库那么意味着也只能支持单用户操作,这就导致了数据量大且链接多的情况下会产生大量的连接积压

二、配置Hive的元数据库

1、编辑环境变量:vim /etc/profile

​ 添加配置:

1
2
3
4
JAVA_HOME=/home/software/jdk1.8
HADOOP_HOME=/home/software/hadoop-2.7.6
HIVE_HOME=/home/software/hive-2.3.7
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:

​ 配置完成之后需要重新生效:source /etc/profile

2、配置Hive的conf目录下的hive-env.sh文件

​ ①复制模版文件:cp hive-env.sh.template hive-env.sh

​ ②添加配置:

1
2
3
4
export JAVA_HOME=/home/software/jdk1.8
export HADOOP_HOME=/home/software/hadoop-2.7.6
export HIVE_CONF_DIR=/home/software/hive-2.3.7/conf
export HIVE_AUX_JARS_PATH=/home/software/hive-2.3.7/lib

3、编辑hive-site.xml文件

​ 添加配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!-- 指定Hive的数据存储目录 -->
<name>hive.metastore.warehouse.dir</name>
<value>/home/software/hive-2.3.7/warehouse</value>
</property>
<property>
<!-- 配置MySQL的连接字符串 -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
</property>
<property>
<!-- 配置MySQL的连接驱动 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<!-- 配置登录MySQL的用户名称 -->
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<!-- 配置登录MySQL的密码 -->
<name>javax.jdo.option.ConnectionPassword</name>
<value>Root123456~!</value>
</property>
<property>
<!-- 配置Hive的慢查询日志目录 -->
<name>hive.querylog.location</name>
<value>hdfs:///ns/user/hive/log</value>
</property>
<property>
<!-- hive的server2的连接端口 -->
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<!-- hive的sever2的连接主机 -->
<name>hive.server2.thrift.bind.host</name>
<value>192.168.232.128</value>
</property>
<property>
<!-- hive的元数据服务的uri -->
<name>hive.metastore.uris</name>
<value>thrift://192.168.232.128:9083</value>
</property>
</configuration>

4、将MySQL的驱动包拷贝至Hive的lib目录下

1
cp mysql-connector-java-5.1.38-bin.jar /home/software/hive-2.3.7/lib/

5、执行初始化操作

1
schematool -initSchema -dbType mysql

6、进入MySQL数据库会出现hive数据库,并且在该库下会出现57张数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
mysql> show tables;
+---------------------------+
| Tables_in_hive |
+---------------------------+
| AUX_TABLE |
| BUCKETING_COLS |
| CDS |
| COLUMNS_V2 |
| COMPACTION_QUEUE |
| COMPLETED_COMPACTIONS |
| COMPLETED_TXN_COMPONENTS |
| DATABASE_PARAMS |
| DBS |
| DB_PRIVS |
| DELEGATION_TOKENS |
| FUNCS |
| FUNC_RU |
| GLOBAL_PRIVS |
| HIVE_LOCKS |
| IDXS |
| INDEX_PARAMS |
| KEY_CONSTRAINTS |
| MASTER_KEYS |
| NEXT_COMPACTION_QUEUE_ID |
| NEXT_LOCK_ID |
| NEXT_TXN_ID |
| NOTIFICATION_LOG |
| NOTIFICATION_SEQUENCE |
| NUCLEUS_TABLES |
| PARTITIONS |
| PARTITION_EVENTS |
| PARTITION_KEYS |
| PARTITION_KEY_VALS |
| PARTITION_PARAMS |
| PART_COL_PRIVS |
| PART_COL_STATS |
| PART_PRIVS |
| ROLES |
| ROLE_MAP |
| SDS |
| SD_PARAMS |
| SEQUENCE_TABLE |
| SERDES |
| SERDE_PARAMS |
| SKEWED_COL_NAMES |
| SKEWED_COL_VALUE_LOC_MAP |
| SKEWED_STRING_LIST |
| SKEWED_STRING_LIST_VALUES |
| SKEWED_VALUES |
| SORT_COLS |
| TABLE_PARAMS |
| TAB_COL_STATS |
| TBLS |
| TBL_COL_PRIVS |
| TBL_PRIVS |
| TXNS |
| TXN_COMPONENTS |
| TYPES |
| TYPE_FIELDS |
| VERSION |
| WRITE_SET |
+---------------------------+
57 rows in set (0.01 sec)

7、开启Hive的元数据服务

1
hive --service metastore &

8、进入Hive客户端

1
hive

三、Hive的常用命令

create database park; 创建park数据库
use park; 切换数据库
show tables; 查看当前数据库下的所有数据表
create table student(id int,name string); 创建student表及相关的两个字段
insert into student values(1,’tom’); 向student表中插入数据
select * from student; 查询表数据
load data local inpath ‘/home/haha.txt’ into table student; 通过加载本地文件到指定的表中(发现HDFS的student目录多了一个文件,由此可见Hive的工作原理就是管理HDFS上的数据)
create table student(id int,name string) row format delimited fields terminated by ‘ ‘; 创建student表并且指定分隔符为空格
desc student; 查看student表结构
create table student1 like student; 创建student1表,表结构和student表结构,只是复制表结构而不能复制表数据
insert overwrite table student1 select * from student; 将student表中的数据插入到student1表中
insert overwrite local directory ‘/home/stu’ row format delimited fields terminated by ‘ ‘ select * from student1; 将student1表中的数据写到本地的/home/stu目录下
alter table student rename to student2; 为student表重命名为student2
alter table student1 add columns(age int); 为student1表中添加一个字段age
exit; 退出Hive

四、Hive的表结构

1、内部表

​ 先在Hive中建立一个表结构然后向这个表中插入数据

2、外部表

​ ①HDFS里面已经存在数据,然后通过Hive创建表结构管理HDFS上的数据

​ ②建表语句(指定的Location要求是一个目录而不是一个文件):

1
create external table flow(phone string,city string,name string,flow int) row format delimited fields terminated by ' ' location '/flow';

​ ③内部表在被删除的时候,对应的目录会立即从HDFS上移除;外部表被删除的时候,对应的数据并不会被删除

实际开发中,一般在大数据海量数据处理的前提下最开始的是会先建立外部表

3、分区表

​ ①作用:对数据进行分类的

​ ②示例

​ 1、建表语句

1
create table cities(id int,name string) partitioned by (province string) row format delimited fields terminated by ' ';

​ 2、加载数据

1
load data local inpath '/home/hivedemo/shanxi.txt' into table cities partition(province = 'shanxi');

​ ③每一个分区在HDFS上对应的了一个目录,如果在查询的时候指定分区,那么查询效率就会相对而言比较高,

如果在查询的时候跨分区查询那么效率反而会比较低

​ ④将HDFS上的目录添加为分区

1
alter table cities add partition(province = 'shandong') location '/home/software/hive-2.3.7/warehouse/park.db/cities/province=shandong';

​ ⑤批量修复 — 本身不稳定,在分区较多的情况下可能会修复失败

1
msck repair table cities;

​ ⑥删除分区

1
alter table cities drop partition(province = 'hebei');

​ ⑦修改分区名称

1
alter table cities partition(province = 'hubei') rename to partition(province = 'hb');

​ ⑧多字段分区

​ 1、建表语句

1
create table student(id int,name string) partitioned by (grade string,class string) row format delimited fields terminated by ' ';

​ 2、加载数据

1
2
3
load data local inpath '/home/hivedemo/g1c1.txt' into table student partition (grade = '1',class = '1');
load data local inpath '/home/hivedemo/g1c2.txt' into table student partition (grade = '1',class = '2');
load data local inpath '/home/hivedemo/g2c1.txt' into table student partition (grade = '2',class = '1');