07-Hive环境搭建
星期一, 4月 7, 2025 | 8分钟阅读

关于Linux系统大数据环境搭建——07-Hive环境搭建。
07-Hive环境搭建
Hive版本:Hive 3.1.2
单节点环境搭建
目标环境
注意:安装前请确认当前集群已安装了 MySQL 数据库和 Hadoop 的 HA + YARN。
安装
解压
将准备好的安装包上传至 node01,然后解压:
[root@node01 ~]# tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/yjx/
[root@node01 ~]# rm apache-hive-3.1.2-bin.tar.gz -rf
修改配置文件
修改环境配置脚本文件 hive-env.sh
:
[root@node01 ~]# cd /opt/yjx/apache-hive-3.1.2-bin/conf/
[root@node01 conf]# cp hive-env.sh.template hive-env.sh
[root@node01 conf]# vim hive-env.sh
在文件末尾添加以下内容:
HADOOP_HOME=/opt/yjx/hadoop-3.3.4/
export HIVE_CONF_DIR=/opt/yjx/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/opt/yjx/apache-hive-3.1.2-bin/lib
修改配置文件 hive-site.xml
:
[root@node01 conf]# cp hive-default.xml.template hive-site.xml
[root@node01 conf]# vim hive-site.xml
首先删除 configuration
节点中的所有内容,然后再在 configuration
节点中添加以下内容:
<!-- 数据库相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.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>
<!-- 自动创建表 -->
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<!-- 强制 MetaStore 的 schema 一致性,开启的话会校验在 MetaStore 中存储的信息的版本和 Hive 的 jar 包中的版
本一致性,并且关闭自动 schema 迁移,用户必须手动的升级 Hive 并且迁移 schema。关闭的话只会在版本不一致时给出警
告,默认是 false 不开启 -->
<!-- 元数据校验 -->
<property>
<name>hive.metastore.schema.verification</name>
<!-- MySQL8 这里一定要设置为 true,不然后面 DROP TABLE 可能会出现卡住的情况 -->
<value>true</value>
</property>
<!-- 美化打印数据 -->
<!-- 是否显示表名与列名,默认值为 false -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 是否显示数据库名,默认值为 false -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- Hive 数据仓库的位置(HDFS 中的位置) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<!-- HiveServer2 通过 Thrift 访问 MetaStore -->
<!-- 配置 Thrift 服务绑定的服务器地址,默认为 127.0.0.1 -->
<!--
<property>
<name>hive.server2.thrift.bind.host</name>
<value>127.0.0.1</value>
</property>
-->
<!-- 配置 Thrift 服务监听的端口,默认为 10000 -->
<!--
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
-->
<!-- HiveServer2 的 WEBUI -->
<!-- 页面中会显示当前链接的会话,包括IP、用户名、当前执行的操作(查询)数量、链接总时长、空闲时长等 -->
<property>
<name>hive.server2.webui.host</name>
<value>node01</value>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<!-- 指定 hive.metastore.uris 的 port,为了启动 MetaStore 服务的时候不用指定端口 -->
<!-- hive ==service metastore -p 9083 & | hive ==service metastore -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node01:9083</value>
</property>
<!-- 客户端连接 Hive 元数据的超时时间,默认为 600s -->
<!-- 需要一个时间单位(d/day, h/hour, m/min, s/sec, ms/msec, us/usec, ns/nsec),如果未指定,默认为秒 -->
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>600s</value>
</property>
注意:防止 xml 解析注释出问题,用 == 表示 –。实际为:hive –service metastore -p 9083 & | hive –service metastore
前面提到 Hive 实际上底层跑的仍然是 MapReduce 程序,那么我们需要让它拥有在 Hadoop 上运行的权限,修改Hadoop 的配置文件 core-site.xml
:
[root@node01 conf]# vim /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml
在 configuration
节点中末尾处添加以下内容:
<!-- 该参数表示可以通过 httpfs 接口访问 HDFS 的 IP 地址限制 -->
<!-- 配置 root(超级用户) 允许通过 httpfs 方式访问 HDFS 的主机名、域名 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!-- 通过 httpfs 接口访问的用户获得的群组身份 -->
<!-- 配置允许通过 httpfs 方式访问的客户端的用户组 -->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
提示:这里的 root 表示安装 Hive 时的用户,实际上是为 Hive 在 Hadoop 上创建了一个代理用户。
配置日志组件
首先创建日志目录:
[root@node01 conf]# mkdir /opt/yjx/apache-hive-3.1.2-bin/logs
[root@node01 conf]# cp hive-log4j2.properties.template hive-log4j2.properties
[root@node01 conf]# vim hive-log4j2.properties
将 property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name}
替换为:
property.hive.log.dir = /opt/yjx/apache-hive-3.1.2-bin/logs
添加驱动包
将 MySQL 驱动包(注意自己的 MySQL 版本)添加到 Hive 的 lib 目录下:
[root@node01 ~]# mv mysql-connector-java-8.0.18.jar /opt/yjx/apache-hive-3.1.2-bin/lib/
拷贝至其他节点
将 node01 已配置好的 Hive 拷贝至 node02 和 node03。
[root@node02 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/
[root@node03 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/apache-hive-3.1.2-bin
将 node01 修改后的 Hadoop 的 core-stie.xml
配置文件拷贝至 node02 和 node03。
[root@node01 ~]# scp /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml root@node02:/opt/yjx/hadoop-
3.3.4/etc/hadoop/
[root@node01 ~]# scp /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml root@node03:/opt/yjx/hadoop-
3.3.4/etc/hadoop/
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml
配置环境变量
三个节点修改环境变量 vim /etc/profile
,在文件末尾添加以下内容:
export HIVE_HOME=/opt/yjx/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH
修改完成后 source /etc/profile
重新加载环境变量。
启动
检查 MySQL 服务是否启动。
[root@node01 ~]# systemctl status mysqld
启动 ZooKeeper(三台机器都需要执行)。
zkServer.sh start
zkServer.sh status
启动 HDFS + YARN。
[root@node01 ~]# start-all.sh
启动 JobHistory。
[root@node01 ~]# mapred --daemon start historyserver
初始化 hive 数据库(第一次启动时执行)。
[root@node01 ~]# schematool -dbType mysql -initSchema
初始化数据库结果如下:
启动 MetaStore 服务。
# 前台启动,学习期间推荐使用这种方式
[root@node01 ~]# hive --service metastore
# 后台启动
[root@node01 ~]# nohup hive --service metastore > /dev/null 2>&1 &
启动 HiveServer2 服务。
# 前台启动,学习期间推荐使用这种方式
[root@node01 ~]# hiveserver2
# 后台启动
[root@node01 ~]# nohup hiveserver2 > /dev/null 2>&1 &
客户端连接
客户端连接方式一。
[root@node03 ~]# hive
# 退出命令行命令:exit;
客户端连接方式二。
[root@node03 ~]# beeline -u jdbc:hive2://node01:10000 -n root
# 退出命令行命令:!exit 或者 !quit
客户端连接方式三。
- 方法一:直接执行
beeline -u jdbc:hive2://node01:10000 -n root
- 方法二:先执行
beeline
,再执行!connect jdbc:hive2://node01:10000
,然后输入用户名,这个用户名就是安装 Hadoop 集群的用户名,无密码的话直接回车即可
10000 为 hive.server2.thrift.port 的默认值(Thrift Server 的 TCP 端口默认为 10000)。
关闭
先关闭 HiveServer2 服务和 MetaStore 服务(前台启动的话直接 Ctrl + C 即可)。
再关闭 JobHistory 和 Hadoop。
[root@node01 ~]# mapred --daemon stop historyserver
[root@node01 ~]# stop-all.sh
再关闭 ZooKeeper(三台机器都需要执行)。
zkServer.sh stop
环境搭建成功后删除安装包, shutdown -h now
关机拍摄快照。
高可用环境搭建
目标环境
注意:安装前请确认当前集群已安装了 MySQL 数据库和 Hadoop 的 HA + YARN。
安装
解压
将准备好的安装包上传至 node01,然后解压:
[root@node01 ~]# tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/yjx/
[root@node01 ~]# rm apache-hive-3.1.2-bin.tar.gz -rf
修改配置文件
修改环境配置脚本文件 hive-env.sh
:
[root@node01 ~]# cd /opt/yjx/apache-hive-3.1.2-bin/conf/
[root@node01 conf]# cp hive-env.sh.template hive-env.sh
[root@node01 conf]# vim hive-env.sh
在文件末尾添加以下内容:
HADOOP_HOME=/opt/yjx/hadoop-3.3.4/
export HIVE_CONF_DIR=/opt/yjx/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/opt/yjx/apache-hive-3.1.2-bin/lib
修改配置文件 hive-site.xml
:
[root@node01 conf]# cp hive-default.xml.template hive-site.xml
[root@node01 conf]# vim hive-site.xml
首先删除 configuration
节点中的所有内容,然后再在 configuration
节点中添加以下内容:
<!-- 数据库相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.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>
<!-- 自动创建表 -->
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<!-- 强制 MetaStore 的 schema 一致性,开启的话会校验在 MetaStore 中存储的信息的版本和 Hive 的 jar 包中的版
本一致性,并且关闭自动 schema 迁移,用户必须手动的升级 Hive 并且迁移 schema。关闭的话只会在版本不一致时给出警
告,默认是 false 不开启 -->
<!-- 元数据校验 -->
<property>
<name>hive.metastore.schema.verification</name>
<!-- MySQL8 这里一定要设置为 true,不然后面 DROP TABLE 可能会出现卡住的情况 -->
<value>true</value>
</property>
<!-- 美化打印数据 -->
<!-- 是否显示表名与列名,默认值为 false -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 是否显示数据库名,默认值为 false -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- Hive 数据仓库的位置(HDFS 中的位置) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<!-- 是否启用 HiveServer2 的动态服务发现功能(是否开启高可用) -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>
<!-- HiveServer2 在支持动态服务发现时使用的 ZooKeeper 中的父节点 -->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2-ha</value>
</property>
<!-- ZooKeeper 服务器地址 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<!-- ZooKeeper 服务器端口 -->
<!-- 如果在 hive.zookeeper.quorum 中指定的 ZooKeeper 服务器列表不包含端口号,则使用此值 -->
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
<!-- HiveServer2 通过 Thrift 访问 MetaStore -->
<!-- 配置 Thrift 服务绑定的服务器地址,默认为 127.0.0.1 -->
<!--
<property>
<name>hive.server2.thrift.bind.host</name>
<value>127.0.0.1</value>
</property>
-->
<!-- 配置 Thrift 服务监听的端口,默认为 10000 -->
<!--
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
-->
<!-- HiveServer2 的 WEBUI -->
<!-- 页面中会显示当前链接的会话,包括IP、用户名、当前执行的操作(查询)数量、链接总时长、空闲时长等 -->
<property>
<name>hive.server2.webui.host</name>
<value>node01</value>
</property>
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<!-- 指定 hive.metastore.uris 的 port,为了启动 MetaStore 服务的时候不用指定端口 -->
<!-- hive ==service metastore -p 9083 & | hive ==service metastore -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node01:9083,thrift://node02:9083</value>
</property>
<!-- 客户端连接 Hive 元数据的超时时间,默认为 600s -->
<!-- 需要一个时间单位(d/day, h/hour, m/min, s/sec, ms/msec, us/usec, ns/nsec),如果未指定,默认为秒 -->
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>600s</value>
</property>
注意:防止 xml 解析注释出问题,用 == 表示 –。实际为:hive –service metastore -p 9083 & | hive –service metastore
前面提到 Hive 实际上底层跑的仍然是 MapReduce 程序,那么我们需要让它拥有在 Hadoop 上运行的权限,修改Hadoop 的配置文件 core-site.xml
:
[root@node01 conf]# vim /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml
在 configuration
节点中末尾处添加以下内容:
<!-- 该参数表示可以通过 httpfs 接口访问 HDFS 的 IP 地址限制 -->
<!-- 配置 root(超级用户) 允许通过 httpfs 方式访问 HDFS 的主机名、域名 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<!-- 通过 httpfs 接口访问的用户获得的群组身份 -->
<!-- 配置允许通过 httpfs 方式访问的客户端的用户组 -->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
提示:这里的 root 表示安装 Hive 时的用户,实际上是为 Hive 在 Hadoop 上创建了一个代理用户。
配置日志组件
首先创建日志目录:
[root@node01 conf]# mkdir /opt/yjx/apache-hive-3.1.2-bin/logs
[root@node01 conf]# cp hive-log4j2.properties.template hive-log4j2.properties
[root@node01 conf]# vim hive-log4j2.properties
将 property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name}
替换为:
property.hive.log.dir = /opt/yjx/apache-hive-3.1.2-bin/logs
添加驱动包
将 MySQL 驱动包(注意自己的 MySQL 版本)添加到 Hive 的 lib 目录下:
[root@node01 ~]# mv mysql-connector-java-8.0.18.jar /opt/yjx/apache-hive-3.1.2-bin/lib/
拷贝至其他节点
将 node01 已配置好的 Hive 拷贝至 node02 和 node03。
[root@node02 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/
[root@node03 ~]# scp -r root@node01:/opt/yjx/apache-hive-3.1.2-bin /opt/yjx/
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/apache-hive-3.1.2-bin
提示:node02 服务器需要修改
hive-site.xml
配置文件中hive.server2.webui.host
属性的值为node02
。
将 node01 修改后的 Hadoop 的 core-stie.xml 配置文件拷贝至 node02 和 node03。
[root@node01 ~]# scp /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml root@node02:/opt/yjx/hadoop-
3.3.4/etc/hadoop/
[root@node01 ~]# scp /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml root@node03:/opt/yjx/hadoop-
3.3.4/etc/hadoop/
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/hadoop-3.3.4/etc/hadoop/core-site.xml
配置环境变量
三个节点修改环境变量 vim /etc/profile
,在文件末尾添加以下内容:
export HIVE_HOME=/opt/yjx/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH
修改完成后 source /etc/profile
重新加载环境变量。
启动
检查 MySQL 服务是否启动。
[root@node01 ~]# systemctl status mysqld
启动 ZooKeeper(三台机器都需要执行)。
zkServer.sh start
zkServer.sh status
启动 HDFS + YARN。
[root@node01 ~]# start-all.sh
启动 JobHistory。
[root@node01 ~]# mapred --daemon start historyserver
初始化 hive 数据库(第一次启动时执行)。
[root@node01 ~]# schematool -dbType mysql -initSchema
初始化数据库结果如下:
启动 MetaStore 服务。
# 前台启动,学习期间推荐使用这种方式
[root@node01 ~]# hive --service metastore
[root@node02 ~]# hive --service metastore
# 后台启动
[root@node01 ~]# nohup hive --service metastore > /dev/null 2>&1 &
[root@node02 ~]# nohup hive --service metastore > /dev/null 2>&1 &
启动 HiveServer2 服务。
# 前台启动,学习期间推荐使用这种方式
[root@node01 ~]# hiveserver2
[root@node02 ~]# hiveserver2
# 后台启动
[root@node01 ~]# nohup hiveserver2 > /dev/null 2>&1 &
[root@node02 ~]# nohup hiveserver2 > /dev/null 2>&1 &
客户端连接
客户端连接方式一。
[root@node03 ~]# hive
# 退出命令行命令:exit;
客户端连接方式二。
当 HiveServer2 注册至 ZooKeeper 以后,JDBC 连接的 URL 格式需要为:
jdbc:hive2://<zookeeper quorum>/<db>;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-ha
<zookeeper quorum>
:ZooKeper 服务器列表,例如node01:2181,node02:2181,node03:2181
;<db>
:要连接至 Hive 的哪个数据库,默认为 default;serviceDiscoveryMode
:指定模式为 zooKeeper;zooKeeperNamespace
:指定 ZooKeper 中的 Namespace,即参数hive.server2.zookeeper.namespace
所定义的值。 其他参数请参考官网:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-ConnectionURLWhenZooKeeperServiceDiscoveryIsEnabled 完整连接方式如下:- 方法一:直接执行
beeline -u "jdbc:hive2://node01:2181,node02:2181,node03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-ha" -n root
- 方法二:先执行
beeline
,再执行!connect
jdbc:hive2://node01:2181,node02:2181,node03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-ha
,然后输入用户名,这个用户名就是安装 Hadoop 集群的用户名,无密码的话直接回车即可
[root@node03 ~]# beeline -u
"jdbc:hive2://node01:2181,node02:2181,node03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=h
iveserver2-ha" -n root
...
Connecting to
jdbc:hive2://node01:2181,node02:2181,node03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hi
veserver2-ha
# 注意下面这行:连接至 node01:10000
[main]: INFO jdbc.HiveConnection: Connected to node01:10000
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 3.1.3)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.3 by Apache Hive
0: jdbc:hive2://node01:2181,node02:2181,node03:2181>
关闭其中一个 Hiveserver2 服务,例如 node01,重新使用 beeline 进行连接结果如下。
# 先执行 beeline
[root@node03 ~]# beeline
...
Beeline version 3.1.3 by Apache Hive
# 再执行 !connect
beeline> !connect
jdbc:hive2://node01:2181,node02:2181,node03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hi
veserver2-ha
Connecting to
jdbc:hive2://node01:2181,node02:2181,node03:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hi
veserver2-ha
# 然后输入用户名,这个用户名就是安装 Hadoop 集群的用户名,无密码的话直接回车即可
Enter username for jdbc:hive2://node01:2181,node02:2181,node03:2181/: root
Enter password for jdbc:hive2://node01:2181,node02:2181,node03:2181/:
# 注意下面这行:连接至 node02:10000
[main]: INFO jdbc.HiveConnection: Connected to node02:10000
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 3.1.3)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://node01:2181,node02:2181,node03:2181>
关闭
先关闭 HiveServer2 服务和 MetaStore 服务(前台启动的话直接 Ctrl + C 即可)。 再关闭 JobHistory 和 Hadoop。
[root@node01 ~]# mapred --daemon stop historyserver
[root@node01 ~]# stop-all.sh
再关闭 ZooKeeper(三台机器都需要执行)。
zkServer.sh stop
环境搭建成功后删除安装包, shutdown -h now
关机拍摄快照。