Hive部署

概述

Hive起初是由Facebook开源的一款基于Hadoop的用于统计海量结构化数据的一个数据仓库,可以将结构化的数据文件映射为一张数据库表, 并提供类 SQL 查询功能, hive 底层是将 SQL 语句转换为 MapReduce 任务运行。Hive一开始的出发点是为了方便非Java开发人员对HDFS上的数据做,Hive的特点:扩展性,Hive 可以自由的扩展集群的规模,而且一般情况下不需要重启服;延展性, Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数; 容错 ,良好的容错性,可以保障即使有节点出现问题, SQL 语句仍可完成执 。本实验将会手把手带你从零搭建起一个Hive的开发环境,更全面的了解认识数据仓库的定义以及ETL数据处理方式。

环境

CentOS7

流程

官网:**Hive**

  • **用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。 **
  • **Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 **
  • **解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。 **

Hive与Hadoop的关系

Hive处理的数据实际存放再HDFS中

Hive分析数据的底层实现还是MapReduce

Hive调度资源时,用的是Yarn框架

再服务器中运行Hive之前需要群起HDFS和YARN


MySQL准备

Hive需要与MySQL进行连接,保持数据的持久化

创建hive用户与数据库metastore

1
2
create user hive@'%' identified by '密码';
create database metastore;

pCrLrYd.md.png](https://imgse.com/i/pCrLrYd)

hive用户权限设置

1
2
grant all on *.* to hive@'%';   //全部权限
flush privileges; //刷新

pCrLdeO.png

配置Hive与MySQL的连接

将mysql-connector-java-xxx.jar包复制到hive源目录lib

1
cp mysql-connector-java-5.1.46-bin.jar /opt/hive-1.2.2/lib/

pCrLUOK.png


部署与配置

部署

Hive本身使用的是Java语言编写,因此它的运行环境需要Java环境支持,那么我们在之前的Hadoop实验中已经安装配置过Java的环境变量,所以此步骤可以略过,直接进行Hive的配置。

可以到清华镜像下载:Hive1.1.2下载 进行下载然后解压到相关指定目录,进行简单的配置即可使用。解压至/opt/,版本选择的是1.1.2版本,对应Hadoop2.x.y版本。**Hadoop,Hive版本对应**。

提前启动Hadoop相关服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 移动到Hadoop主目录下

# NameNode节点
sbin/hadoop-daemon.sh start namenode
# DataNode
sbin/hadoop-daemon.sh start datanode

# Resourcemanager
sbin/hadoop-daemon.sh start resourcemanager

# Nodemanager
sbin/hadoop-daemon.sh start nodemanager

# 查看进程
jps

pCDLpjK.png

开头提到了Hive与Hadoop的关系,底层的存储是依赖于HDFS的,所以我们需要现在HDFS文件系统上新建几个子目录以便于存储Hive的相关数据文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在Hadoop主目录下输入以下命令
cd $HADOOP_HOME

# /user/hive/warehouse是指在用户主目录下的Hive/warehouse存放hive相关的其它数据文件
bin/hdfs dfs -mkdir -p /user/hive/warehouse

# tmp用于存放job任务运行时产生的临时文件
bin/hdfs dfs -mkdir /user/hive/tmp

# hive运行日志。通过Hadoop的配置来控制,通常Hadoop会为每一个MapReduce任务产生一个日志文件,存储在执行任务的机器上。这个文件可以在Hadoop的WebUI上看到
bin/hdfs dfs -mkdir /user/hive/logs

# 查看目录 -R表示递归
bin/hdfs dfs -ls —R /

打开浏览器输入IP地址:50070也能查看

pCDqTXT.png

为新建的目录添加文件权限,可以让系统中的同个用户组的多个用户都可以对于HDFS上的数据文件进行操作。

1
2
3
bin/hdfs dfs -chmod g+w /user/hive/warehouse
bin/hdfs dfs -chmod -R 777 /user/hive/tmp
bin/hdfs dfs -chmod g+w /user/hive/logs

创建hive文档目录和日志目录

1
2
cd /opt/hive-1.2.2
mkdir logs

pCrLwwD.png

配置

配置hive-env.sh

先移动至hive主目录下,找到conf子目录进入,可以看到conf目录里面有四个文件,我们找到hive-env.sh.template,文件后缀有.template表示该文件还未生效,也就是系统是不会读取的,所以我们需要先重命名一下该文件。

1
2
3
cd /opt/hive-1.2.2/conf
mv hive-env.sh.template hive-env.sh
vim hive-env.sh

两个参数的含义是在hive启动的时候,需要读取Hadoop和hive自身的配置信息,所以需要在文件中添加Hadoop和hive所在的绝对路径

1
2
3
4
# HADOOP_HOME=${bin}/../../hadoop
HADOOP_HOME=/opt/hadoop-2.6.5
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/hive-1.2.2/conf

pCDqOAJ.png

配置hive-site.xml

1
vim 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
<property>
<!--该目录由Hive用来存储查询的不同map / reduce阶段的计划以及存储这些阶段的中间输出 -->
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
</property>

<property>
<!--本地数据仓库目录-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>

<property>
<!-- 示查询表的头部信息 -->
<name>hive.cli.print.header</name>
<value>true</value>
</property>

<property>
<!-- 当前数据仓库 -->
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>

<property>
<!-- hive中MapReduce任务日志文件目录 -->
<name>hive.querylog.location</name>
<value>/user/hive/logs</value>
</property>

<property>
<!-- 配置 MySQL 数据库连接信息 -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://ip地址(主机名):3306/metastore(数据库名)?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8;useSSL=false</value>
</property>

<property>
<!-- 配置 MySQL 驱动 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<--> 有些高版本的驱动需要在改成com.mysql.cj.jdbc.Driver </-->
</property>

<property>
<!--mysql中hive用户-->
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>

<property>
<!--mysql中hive用户密码-->
<name>javax.jdo.option.ConnectionPassword</name>
<value>密码</value>
</property>

<property>
<!-- HiveServer2 -->
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<property>
<name>hive.server2.thrift.bind.host</name>
<value>主机名(IP地址)</value>
</property>

</configuration>

配置运行日志信息配置

1
2
cp hive-log4j.properties.template hive-log4j.properties
vim hive-log4j.properties

pCDqXN9.png


配置环境变量

1
vim /etc/profile
1
2
3
# set HIVE
export HIVE_HOME=/opt/hive-1.2.2
export PATH=$PATH:$HIVE_HOME/bin

pCDLe3t.png

1
2
3
4
# 刷新环境变量
source /etc/profile
# 验证版本
hive --version

pCDLSc6.png


初始化hive

1
2
3
# cd $HIVE_HOME

./bin/schematool -dbType mysql -initSchema

初始化

MySQL验证

pCrLclt.png


Hive基本操作

进入Hive交互界面

查看数据库

1
show databases

创建数据库

1
2
3
4
5
6
#格式: create database if not exists数据库名称;
#含义: 判断如果不存在,就创建
create database if not exists db_test01;

# 选择数据库
use db_test01;

创建数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#格式
#create table 表名(
#字段名 类型,
#字段名 类型,
#...
#)row format delimited fields terminated by '\t';
# 含义1create table 创建一个指定名字的表。如果有相同名的表已经存在,则抛出异常;
#可以用if not exists选项来忽略这个异常
# 含义2row format delimited代表一行是一条数据,是自己创建的全部字段和文件的字段对应,
#一行对应一条记录。是自己创建的全部字段和文件的字段对应,一行对应一条记录.
# 含义3:fields terminated by '\t';代表一行记录中的各个字段以什么隔开,方便创建的数据
#字段对应文件的一条记录的字段。我们这里选择的是\t制表符分割。

create table student(
num int,
name string
)row format delimited fields terminated by '\t';

# 查看表
show tables;

hive-show-tables

加载数据到数据表中

1
2
3
#格式: load data local inpath '本地文件的绝对路径' into table数据表名称 ;
#含义:这是Hive导入数据的其中一种方式,从本地文件系统中将数据文件复制到Hive的表中
load data local inpath '/home/amsk/test/hive-test.txt' into table student;

查询student数据表的数据

1
2
3
#格式select * from数据表名称;
#查询该数据表中的所有字段数据
select * from student;