第 2 章 Hive 环境搭建

2022年4月28日 487点热度

这一章我们开始学习如何搭建 Hive 的3种运行模式,先从最简单的内嵌模式开始。

在开始安装 Hive 之前,我们需要提前在 CentOS 7上安装好 JDK、Hadoop完全分布式集群以及 MySQL数据库后才开始安装 Hive。

如果不知道怎么安装的同学请看本篇文章:Hadoop完全分布式集群搭建

2.1 Hive 安装地址

2.1.1 Hive 官方网站

https://hive.apache.org/

2.1.2 Hive 文档地址

https://cwiki.apache.org/confluence/display/Hive//LanguageManual

2.1.3 Hive 下载地址

https://dlcdn.apache.org/hive/

2.1.4 Hive 开源地址

https://github.com/apache/hive

2.1.5 软件安装准备

虚拟化软件:VMware Workstation Pro 12+ 或者 Oracle VM VirtualBox v6.1.28

Linux 发行版本:CentOS-7-x86_64-Minimal-1810.iso

远程连接工具:MobaXterm v20.3 或者 XShell 6

JDK:jdk1.8.0_202

Hadoop:hadoop-2.7.7

MySQL:v5.7

数据库驱动包:mysql-connector-java-5.1.49

数据库连接工具:Navicat Premium 15+ 或者 MySQL Workbench

Hive:hive-2.3.4

2.2 MySQL 安装

MySQL 的安装方式有很多种,但我推荐使用离线安装,离线安装不会因为网络问题导致安装不成功。MySQL 离线安装请看这里:附录-1 Hive 环境搭建之 MySQL 5.7 数据库安装

2.3 Hive 安装部署

在开始安装 Hive 之前,请先确保我们已经安装好了 Hadoop 集群,否则我们启动 Hive 将会报错。Hadoop 的安装请看这里:Hadoop 环境搭建

2.3.1 环境变量配置

1、下载 Hive 安装包

我们可以通过 2.1.3 小节提供链接找到对应的版本进行下载。

下载完成后,我们将 Hive 安装包通过第三方连接工具上传至 master 节点的 /opt/softwares 目录下。

2、解压 Hive 安装包

使用解压命令解压 Hive:

[root@master software]# tar -zxvf apache-hive-2.3.4-bin.tar.gz -C /opt/

修改解压包名称:

[root@master software]# cd /opt
[root@master opt]# mv apache-hive-2.3.4-bin hive-2.3.4

3、配置 Hive 环境变量

修改 /etc/profile 文件,修改命令如下:

[root@master conf]# vi /etc/profile
# 添加如下代码
# HIVE_HOME
export HIVE_HOME=/opt/hive-2.3.4
export PATH=$PATH:$HIVE_HOME/bin

使用【:wq】保存退出,让文件立刻生效:

[root@master conf]# source /etc/profile

4、修改 hive-env.sh 配置文件

我们利用 hive-env.sh.template 模板文件复制一份并修改名称:

[root@master conf]# cp hive-env.sh.template hive-env.sh

使用 vi 命令打开改文件,修改如下信息:

# 指定 Hadoop 的安装目录
HADOOP_HOME=/opt/hadoop-2.7.7

# 指定 Hive 配置文件目录路径
export HIVE_CONF_DIR=/opt/hive-2.3.4/conf

# 指定 Hive 的依赖库路径
export HIVE_AUX_JARS_PATH=/opt/hive-2.3.4/lib

使用【:wq】保存退出!

2.3.2 内嵌 Derby 模式

由于 hive-site.xml 文件不存在,我们首先需要利用模板文件:hive-default.xml.template 复制一份并修改名称:

[root@master opt]# cd cd hive-2.3.4/conf/
[root@master conf]# cp hive-default.xml.template hive-site.xml

这种模式是最简单的存储方式,只需要在 hive-site.xml 文件做如下配置便可:

<property>
	<name>javax.jdo.option.ConnectionURL</name>
	<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property>
<property>
	<name>javax.jdo.option.ConnectionDriverName</name>
	<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
	<name>hive.metastore.warehouse.dir</name>
	<value>/user/hive/warehouse</value>
</property>

<property>
	<name>hive.exec.local.scratchdir</name>
	<value>/opt/hive-2.3.4/iodir</value>
</property>
<property>
	<name>hive.downloaded.resources.dir</name>
	<value>/opt/hive-2.3.4/iodir</value>
</property>

以上配置信息只需要修改后面两项即可,就可以使用内嵌 Derby 模式了。

使用derby存储方式时,运行hive会在当前目录生成一个 derby 文件和一个 metastore_db 目录,这种存储方式的弊端就是:在同一个目录下同时只能有一个 hive 客户端能使用数据库,否则会报错。
提醒:在启动 Hive 之前,需要先启动 hadoop 集群:start-dfs.shstart-yarn.sh

2.3.3 本地 MySQL 模式

这种存储方式需要在本地运行一个 MySQL 服务器。

同样,我们需要修改 Hive 配置文件:hive-site.xml 中的如下配置信息:

1)配置连接驱动名为:com.mysql.jdbc.Driver

<property>
	<name>javax.jdo.option.ConnectionDriverName</name>
	<value>com.mysql.jdbc.Driver</value>
</property>

2)修改连接 MySQL 的URL:

<property>
	<name>javax.jdo.option.ConnectionURL</name>
	<value>jdbc:mysql://master:3306/metastore?useSSL=false&amp;createDatabaseIfNotExist=true</value>
</property>

3)修改连接数据库的用户名和密码:

<property>
	<name>javax.jdo.option.ConnectionUserName</name>
	<value>root</value>
</property>
<property>
	<name>javax.jdo.option.ConnectionPassword</name>
	<value>123456</value>
</property>

4)修改 Hive 数据仓库地址在 HDFS 上的路径:

<property>
	<name>hive.metastore.warehouse.dir</name>
	<value>/hive/warehouse</value>
</property>

5)将 MySQL 连接驱动包拷贝到 $HIVE_HOME/lib 目录下:

[root@master mysql-connector-java-5.1.49]# cp mysql-connector-java-5.1.49-bin.jar /opt/hive-2.3.4/lib/

6)初始化 Hive 源数据库:

[root@master hive-2.3.4]# schematool -initSchema -dbType mysql -verbose

7)登陆 MySQL 服务,查看源数据库是否初始化成功:

[root@master ~]# mysql -uroot -p
# 查看数据库:metastore
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| metastore          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

# 切换到 metastore 数据库
mysql> use metastore;
# 查看表
mysql> show tables;
+---------------------------+
| Tables_in_metastore       |
+---------------------------+
| aux_table                 |
| bucketing_cols            |
| cds                       |
......

8)启动 Hive:

[root@master hive-2.3.4]# hive
运行本地 MySQL 模式,需要提前启动 Hadoop 集群和 MySQL 服务,否则会报错。

2.3.4 远程 MySQL 模式

如果我们使用远程 MySQL 模式,只需要将 hive-site.xml 配置文件中的 javax.jdo.option.ConnectionURL 属性值中的主机名或者IP地址更改为 MySQL 服务所在的节点主机名或者IP地址。

<property>
	<name>javax.jdo.option.ConnectionURL</name>
	<value>jdbc:mysql://改为mysql服务所在的主机或者IP地址:3306/metastore?useSSL=false&amp;createDatabaseIfNotExist=true</value>
</property>

2.4 使用元数据服务方式访问 Hive

1)在 hive-site.xml 文件中添加如下配置信息:

<!-- 指定存储元数据要连接的地址 -->
<property>
	<name>hive.metastore.uris</name>
	<value>thrift://master:9083</value>
</property>

2)启动 metastore:

[root@master hive-2.3.4]# hive --service metastore &
2022-04-27 14:53:12: Starting Hive Metastore Server

3)启动 hive:

[root@master hive-2.3.4]# hive

4)Hive 从 2.0.0 版本开始,为 HiveServer2 提供了一个简单的 WEB UI 页面,在页面中我们可以直观的看到当前链接的会话、历史日志、配置参数以及度量信息。

默认情况下,Web UI 端口为 10002。

如果要开启 Web UI 需要在 hive-site.xml 配置文件中修改配置:

<property>
	<name>hive.server2.webui.host</name>
	<value>127.0.0.1</value>
</property>

<property>
	<name>hive.server2.webui.port</name>
	<value>10002</value>
</property>

2.5 使用 JDBC 方式访问 Hive

接着我们使用 JDBC 的方式访问 hive。

1)在 hive-site.xml 文件中添加如下配置信息:

<!-- 指定 hiveserver2 连接的 host -->
<property>
	<name>hive.server2.thrift.bind.host</name>
	<value>master</value>
</property>

<!-- 指定 hiveserver2 连接的端口号 -->
<property>
	<name>hive.server2.thrift.port</name>
	<value>10000</value>
</property>

2)启动 hiveserver2

[root@master hive-2.3.4]# hive --service hiveserver2 &
2022-04-27 15:03:57: Starting HiveServer2

3)启动 beeline 客户端(需要多等待一会儿,可能要几分钟)

[root@master hive-2.3.4]# bin/beeline -u jdbc:hive2://master:10000 -n root

4)看到如下输出信息:

Connecting to jdbc:hive2://master:10000
Connected to: Apache Hive (version 2.3.4) 
Driver: Hive JDBC (version 2.3.4)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 2.3.4 by Apache Hive
0: jdbc:hive2://master:10000>

问题一:User: root is not allowed to impersonate mysql

解决办法一:需要将 Hadoop 集群停掉,在所有节点 core-site.xml 文件中添加如下配置信息:

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

解决办法二:在 hive-site.xml 文件中配置如下信息:

<property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
</property> 

重新启动 Hadoop 集群即可。

2.6 Hive 常用交互命令

启动 Hive 后,我们进入 Hive Shell 命令行界面,在该界面中我们可以执行对表数据的增删改查操作。

除了 Hive Shell 以外,Hive 还提供了常用的交互命令。

可以使用 hive -help 查看相关的命令:

[root@master hive-2.3.4]# hive -help
usage: hive
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

1)-e 不进入 hive 的交互窗口执行 sql 语句:

[root@master hive-2.3.4]# hive -e "select * from emp;"

2)-f 执行脚本中的 sql 语句:

(1)在 /opt/apps/hive-2.3.4/ 下创建 data 目录并在 data 目录下创建 hivef.sql 文件:

[root@master data]# touch hivef.sql

(2)在 hivef.sql 文件中写入正确的 sql 语句:

show tables;
select * from emp;

(3)执行 hivef.sql 文件中的 sql 语句:

[root@master data]# hive -f /opt/apps/hive-2.3.4/data/hivef.sql

(4)执行 hivef.sql 文件中的 sql 语句并将结果写入文件中:

[root@master data]# hive -f /opt/apps/hive-2.3.4/data/hivef.sql > /opt/apps/hive-2.3.4/data/hive_result.txt

参数 -e-f 使用频率比较高,其他参数可以在用的时候查看帮助手册就可以了。

2.7 Hive 其他操作命令

接着我们来看看 Hive 的其他操作命令。

1)退出 hive 窗口命令:

hive> quit;
hive> exit;

2)在 hive cli 命令窗口中如何查看 hdfs 文件系统:

hive> dfs -ls /;

3)查看在 hive 中输入的所有历史命令

(1)进入到当前用户的根目录:/root

(2)查看 .hivehistory 文件

[root@master data]# cd /root
[root@master root]# cat .hivehistory

2.8 Hive 常见属性配置

我们在 2.3 小节 修改了 hive-site.xml 配置文件,该文件是全局配置文件,hive 所有相关的属性项都在该文件中,但除了该文件外,我们还可以使用其他方式来配置常见属性。

比如日志文件,我们需要经常和它打交道,因为该日志文件会将 hive 运行的状态信息全部记录在这里面。下面我们看一下如何配置。

2.8.1 Hive 运行日志信息配置

1)Hive 的 log 文件默认存放在 /tmp/root/hive.log 目录下(当前用户名下)

2)修改 hive 的 log 存放日志到 /opt/apps/hive-2.3.4/logs

(1)修改 /opt/apps/hive-2.3.4/conf/hive-log4j2.properties.template 文件名称为 hive-log4j2.properties

[root@master data]# cd /opt/apps/hive-2.3.4/conf
[root@master conf]# mv hive-log4j2.properties.template hive-log4j2.properties

(2)在 hive-log4j2.properties 文件中修改 log 存放位置:

hive.log.dir=opt/apps/hive-2.3.4/logs

2.8.2 打印当前库和表头信息

hive cli 环境里面,我们需要显示当前所在的数据库或者查询筛选数据显示字段信息,设置如下:

<property>
	<name>hive.cli.print.header</name>
	<value>true</value>
</property>

<property>
	<name>hive.cli.print.current.db</name>
	<value>true</value>
</property>

重新登陆 hive ,就可以看到如下信息:

hive (default) >

default 就是我们当前所在的数据库。

2.8.3 参数配置方式

Hive 中的参数配置方式主要有3中方式:配置文件、命令行参数、参数声明

1、配置文件方式

hive 默认配置文件:hive-default.xml

用户自定义配置文件:hive-site.xml

注意:用户自定义配置会覆盖默认配置文件。另外,Hive 也会读入 Hadoop 的配置文件内容,因为 Hive 是作为 Hadoop 的客户端启动的,Hive 的配置会覆盖 Hadoop 的配置。
配置文件的设定对本机启动的所有 Hive 进程都有效。

2、命令行参数方式

这种方式就是,我们在启动 Hive 时,可以在命令行添加 -hiveconf param=value 来设定参数。如:

[root@master hive-2.3.4]# hive -hiveconf mapred.reduce.tasks=10;

注意:该设置仅对本次 Hive 启动有效

查看设置参数是否生效:

hive (default)> set mapred.reduce.tasks;

3、参数声明方式

第三种方式,我们可以在 HQL 中使用 SET 关键字设置参数。如:

hive (default)> set mapred.reduce.tasks=100;

同样地,该设置仅对本次 Hive 启动有效

参看设置参数是否生效:

hive (default)> set mapred.reduce.tasks;

上面这三种设置方式的 优先级 依次递增,即 配置文件<命令行参数<参数声明

我们本章详细学习了 Hive 的安装、Hive 的3中运行模式、Hive 常用的交互命令以及其他操作命令、还介绍了 Hive 常见属性配置以及参数配置的3种方式。重点是我们掌握 Hive 的安装步骤、运行模式之间的区别。

下一张我们将学习 Hive 的数据类型。

Baimi

世上只有两种编程语言:一种是总是被人骂的,一种是从来没人用的。