一、Hive的安装配置
1.0、Hive安装前的规划
本文以apache hadoop发行版本为例,介绍如何实现hadoop与hive的整合,hadoop环境仍然采用《双NameNode高可用Hadoop集群架构》手动安装的hadoop3.4.3环境,hive版本同样采用apache hive发行版本。
这里以3台主机为例作为hive安装环境,采用AlmaLinux9.3版本系统,各主机IP、功能分配如下表所示:
| 主机名 | 运行服务 | 软件版本 | 操作系统与IP |
|---|---|---|---|
| hivedb | hivemetastore hiveserver2 | hive-4.0.1 | Almalinux9.3(192.168.1.169)【slave003】 |
| hiveclient | hive cli beeline cli | hive-4.0.1 | Almalinux9.3(192.168.1.151)【slave002】 |
| mysqldb | mysqld | mysql8.4.5 | Almalinux9.3(192.168.1.169)【slave003】 |
1.1、下载安装Hive
直接从hive官网下载安装包,本文选择的是hive-4.0.1版本;Hive文档上明确说明Hive3.x版本支持Hadoop3.x.y全版本,但是Hive的支持周期只到2024-10-08;而Hive4.x版本则是目前最新的支持发行版,且支持Hadoop3.3.6及其更高版本。又由于hadoop使用的JDK是11版本,因此hive只能最高选择4.0.1版本。
| Hive Release Line | Status | Compatible With | Latest Version |
|---|---|---|---|
| 4.x | Active | Hadoop 3.3.6, Tez 0.10.4 | 4.0.1 |
| 3.x | EOL (Oct 8, 2024) | Hadoop 3.x.y | 3.1.3 |
| 2.x | EOL (May 20, 2024) | Hadoop 2.x.y | 2.3.10 |
| 1.x | EOL (Apr 11, 2024) | Hadoop 1.x.y, 2.x.y | 1.2.2 |
| Hive 分支 | 最低要求 JDK | 能否稳定运行 JDK11 | 你的报错根源 |
|---|---|---|---|
| Hive 3.x(最高 3.1.3) | JDK8 | 仅兼容但大量 bug,生产不推荐 | 原生基于 JDK8 编译,JDK11 模块化反射限制,极易报类缺失、权限异常 |
| Hive 4.0.0 / 4.0.1 | JDK8/11 | ✅ 官方原生支持 JDK11 的最高稳定版 | 编译基线为 JDK8,可完整运行 JDK11,无强制高 JDK 要求,适配 Hadoop3.4.3 |
| Hive 4.1.x | JDK17 | ❌ 最低必须 JDK17,JDK11 直接报版本错误 | 编译文件版本 55.0(JDK17),JDK11 最高识别 55.0 以下,启动失败 |
| Hive 4.2.x | JDK21 | ❌ 强制 JDK21,JDK11 完全无法运行 | 你之前执行 schematool 报错class file version 65.0,就是 4.2.x 编译于 JDK21,JDK11 无法识别 |
bash
#下载安装Hive
#注意:hive需要在hivedb和hiveclient两个机器上安装,在安装hive前,必须确保你已经在这两个机器上部署好了hadoop基础环境,并且创建了hadoop用户
wget https://archive.apache.org/dist/hive/hive-4.0.1/apache-hive-4.0.1-bin.tar.gz -c -P /data
mkdir -p /data/bigdata/hive
tar -zxvf /data/apache-hive-4.0.1-bin.tar.gz -C /data/bigdata/hive
cd /data/bigdata/hive/
ln -s apache-hive-4.0.1-bin current
1.2、配置Hive的环境变量
bash
#配置Hive的环境变量
#编辑hadoop用户下【.bashrc】文件或者【.bash_profile】文件
su - hadoop
#【.bash_profile】文件添加hadoop与hive完整配置内容
#hadoop env
export JAVA_HOME=/opt/openjdk/default
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/data/bigdata/hadoop/current
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HTTPFS_CATALINA_HOME=${HADOOP_HOME}/share/hadoop/httpfs/tomcat
export CATALINA_BASE=${HTTPFS_CATALINA_HOME}
export HTTPFS_CONFIG=/etc/hadoop/conf
export HADOOP_LOG_DIR=/data/bigdata/hadoop/logs
export HADOOP_PID_DIR=/data/bigdata/hadoop/pids
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#hive env
export HIVE_HOME=/data/bigdata/hive/current
export PATH=$PATH:$HIVE_HOME/bin
1.3、配置hive-site.xml
注意:hive-site.xml配置中的HDFS仓库存储路径分为两种【HA高可用Hadoop集群】与【双NameNode高可用hadoop集群】,本文使用双NameNode高可用hadoop集群(有 zkfc、nameservice),则直接在查看hadoop的配置文件【/etc/hadoop/conf/core-site.xml】查看名称是【fs.defaultFS】对应的值(如:hdfs://bigdata);则hive-site.xml配置中【hive.metastore.warehouse.dir】对应的值是【hdfs://bigdata/user/hive/warehouse】(值不能有多个地址用逗号隔开,这是错误的),如下配置所示:
bash
#配置hive-site.xml
cd /data/bigdata/hive/current/conf
vi hive-site.xml
#【hive-sit.xml】文件的完整内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- ===================== 1. HDFS 仓库存储路径 ===================== -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://bigdata/user/hive/warehouse</value>
<description>Hive数据表在HDFS的存储根目录</description>
</property>
<!-- ===================== 2. 本地临时文件目录 ===================== -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/hive/tmp</value>
<description>Hive本地临时文件目录,需提前创建并授权hadoop用户读写</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/tmp/hive/resources/${hive.session.id}_resources</value>
<description>任务运行下载资源临时目录</description>
</property>
<!-- ===================== 3. MySQL元数据库连接配置(Metastore)【必选】 ===================== -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.1.169:3306/hive_metastore?serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=false</value>
<description>MySQL8 连接串,生产环境正式上线建议关闭allowPublicKeyRetrieval=true</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description>MySQL8 驱动类</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Hive@123456</value>
</property>
<!-- ===================== Metastore Hikari连接池【可选】 ===================== -->
<property>
<name>metastore.datasource.maximumPoolSize</name>
<value>20</value>
<description>元数据库连接池最大连接数</description>
</property>
<property>
<name>metastore.datasource.minimumIdle</name>
<value>5</value>
<description>最小空闲连接</description>
</property>
<property>
<name>metastore.datasource.connectionTimeout</name>
<value>30000</value>
<description>获取连接超时30s</description>
</property>
<property>
<name>metastore.datasource.idleTimeout</name>
<value>300000</value>
<description>空闲连接超时5分钟</description>
</property>
<property>
<name>metastore.datasource.maxLifetime</name>
<value>1800000</value>
<description>连接最大生命周期30分钟</description>
</property>
<property>
<name>metastore.datasource.leakDetectionThreshold</name>
<value>60000</value>
<description>连接泄漏检测阈值60s,≥2000消除Hikari警告</description>
</property>
<!-- ===================== 5. DataNucleus 元数据表控制(生产规范) ===================== -->
<property>
<name>datanucleus.autoCreateSchema</name>
<value>false</value>
<description>禁止自动建表,提前执行schematool -initSchema</description>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoStartMechanism</name>
<value>SchemaTable</value>
</property>
<property>
<name>metastore.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- ======== 6. 远程Metastore核心配置【hive-metastore(HMS 服务端)进程不能配置 hive.metastore.uris】 =========== -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://slave003:9083</value>
<description>所有客户端/HiveServer2连接独立Metastore才配置</description>
</property>
<!-- ===================== 7. HiveServer2 基础服务配置【必选】 ===================== -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- ===================== 8. 查询引擎与任务调度优化 ===================== -->
<property>
<name>hive.execution.engine</name>
<value>mr</value>
<!-- 需要Spark替换为spark,Tez替换tez -->
</property>
<property>
<name>hive.exec.parallel</name>
<value>true</value>
</property>
<property>
<name>hive.exec.parallel.thread.number</name>
<value>16</value>
</property>
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>10</value>
</property>
<!-- ===================== 9. CLI展示优化 ===================== -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- ===================== 10. 小文件合并优化【可选】 ===================== -->
<property>
<name>hive.merge.mapfiles</name>
<value>true</value>
</property>
<property>
<name>hive.merge.mapredfiles</name>
<value>true</value>
</property>
<property>
<name>hive.merge.size.per.task</name>
<value>134217728</value>
</property>
<property>
<name>hive.input.format</name>
<value>org.apache.hadoop.hive.ql.io.HiveInputFormat</value>
</property>
<!-- ==============================================================
✅ ACID事务 / ORC事务表配置(Hive4 标准参数【可选】)
============================================================== -->
<property>
<name>hive.support.concurrency</name>
<value>true</value>
<description>开启并发锁机制,事务必备</description>
</property>
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
<description>数据库事务管理器,ACID核心</description>
</property>
<property>
<name>metastore.compactor.initiator.on</name>
<value>true</value>
<description>开启自动压缩调度器</description>
</property>
<property>
<name>metastore.compactor.worker.threads</name>
<value>5</value>
<description>压缩工作线程</description>
</property>
<property>
<name>metastore.compactor.cleaner.on</name>
<value>true</value>
<description>清理旧版本事务文件</description>
</property>
<property>
<name>hive.txn.max.open.batch</name>
<value>1000</value>
</property>
<property>
<name>metastore.compactor.delta.pct.threshold</name>
<value>0.5</value>
<description>增量文件占比达到50%触发minor压缩</description>
</property>
<property>
<name>metastore.compactor.minor.threshold</name>
<value>10</value>
<description>增量文件数量阈值触发minor压缩</description>
</property>
<property>
<name>metastore.compactor.major.threshold</name>
<value>50</value>
<description>触发major大合并阈值</description>
</property>
</configuration>
1.4、下载对应MySQL版本的驱动包
从https://downloads.mysql.com/archives/c-j/ 下载对应的Mysql数据库版本驱动包(如:本文使用mysql8.4.5),如下图所示:

bash
#下载对应mysql版本的驱动包,并将解压好的驱动包复制一份到hive的lib目录下
wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-j-8.4.0.tar.gz -c /data/bigdata/hive
cd /data/bigdata/hive
tar -zxvf mysql-connector-j-8.4.0.tar.gz
cd mysql-connector-j-8.4.0/
cp mysql-connector-j-8.4.0.jar /data/bigdata/hive/current/lib
1.5、mysql数据库的安装与配置
1.5.1、安装mysql数据库
全网最全的关系型数据库MySQL解析及其安装部署的保姆级教程
https://blog.csdn.net/xiaochenxihua/article/details/151891095
bash
#安装部署Mysql官方的二进制包实操流程
#1-下载Mysql的二进制压缩包到本地的/data目录中,且支持断点续传
wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.5-linux-glibc2.28-x86_64.tar.xz -c 0 -P /data
#2-进入/data目录解压下载好的Mysql二进制压缩包到指定目录【/usr/local/mysql】(之所以要解压到/usr/local目录下是由于二进制版本的很多编译环境都在该目录下)
cd /data
tar -xvf mysql-8.4.5-linux-glibc2.28-x86_64.tar.xz -C /usr/local/mysql/
#3-进入/usr/local/mysql目录中修改文件名称为【mysql-8.4.6】且进入该目录下创建data、etc、logs文件夹
cd /usr/local/mysql/
mv mysql-8.4.5-linux-glibc2.28-x86_64 mysql-8.4.5
cd mysql-8.4.5/
mkdir {data,etc,logs}
#4-创建Mysql的服务用户mysql
useradd mysql
id mysql
#5-进入mysql的etc目录下创建配置文件【my.cnf】
cd /usr/local/mysql/mysql-8.4.5/etc/
vi my.cnf
[mysqld]
#指定mysql的数据存放路径
datadir=/usr/local/mysql/mysql-8.4.5/data
socket=/tmp/mysql.sock
#指定mysql的报错日志文件
log-error=/usr/local/mysql/mysql-8.4.5/logs/mysqld-error.log
pid-file=/usr/local/mysql/mysql-8.4.5/logs/mysqld.pid
port=3306
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
#默认时区(东八区)
default-time-zone='+8:00'
#数据库日志时间匹配系统时区
log_timestamps=system
#表名和字段名不区分大小写
lower_case_table_names=1
#6-将mysql文件夹及其内容都授权给mysql用户并初始化(注意:初始化后没有任何信息提示表示初始化成功,否则就是有问题的)
chown -R mysql:mysql /usr/local/mysql/mysql-8.4.5
/usr/local/mysql/mysql-8.4.5/bin/mysqld --defaults-file=/usr/local/mysql/mysql-8.4.5/etc/my.cnf --initialize --user=mysql
#7-查看日志文件获取临时密码(复制一份临时密码用于登录和修改密码)
cd /usr/local/mysql/mysql-8.4.5/logs/
tail -f mysqld-error.log
#8-手动启用mysql服务测试(如可以指定默认的配置文件【 --defaults-file=/usr/local/mysql/mysql-8.4.5/etc/my.cnf】)
/usr/local/mysql/mysql-8.4.5/bin/mysqld_safe --defaults-file=/usr/local/mysql/mysql-8.4.5/etc/my.cnf
#9-查看mysql的进程、网络端口内容(查看到对应的mysql进程与网络端口与我们配置的一致表示正常;确认正常后即可杀死该进程)
ps -ef | grep mysql
netstat -antlp | grep mysql
#10-使用root账号临时密码登录mysql数据库后修改密码后退出(查看是否可以登录进去,可登录则表示成功)
/usr/local/mysql/mysql-8.4.5/bin/mysql -uroot -p '临时密码'
alter user 'root'@'localhost' identified by 'abc123456';
commit;
quit;
#11-配置mysql的服务并启动和设置开机自启
vi /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server 8.4.5
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/mysql-8.4.5/bin/mysqld_safe --defaults-file=/usr/local/mysql/mysql-8.4.5/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
#11.1-重载所有服务
systemctl daemon-reload
#11.2-启动mysql服务
systemctl start mysqld.service
#11.3-查看mysql服务状态
systemctl status mysqld.service
#11.4-设置mysql服务开机自启
systemctl enable mysqld.service
#11.5-停止mysql服务
systemctl stop mysqld.service
#12-可以重启Linux后查看mysql服务状态看它是否开机重启
reboot now
systemctl status mysqld.service
#配置全局可直接使用mysql命令
#方案一:【在/etc/profile】末尾添加配置
cat>>/etc/profile<<'EOF'
export MYSQL_HOME=/usr/local/mysql/mysql-8.4.5
export PATH=$PATH:$MYSQL_HOME/bin
EOF
source /etc/profile
#方案二
ln -s /usr/local/mysql/mysql-8.4.5/bin/* /usr/local/bin/
1.5.2、配置hive所需的mysql内容
bash
#配置hive所需的mysql内容
mysql -u root --p
# 清理旧冲突用户
drop user if exists 'hive'@'localhost';
drop user if exists 'hive'@'192.168.1.%';
# 创建对应网段hive用户,密码和hive-site.xml保持一致
create user 'hive'@'localhost' identified by 'Hive@123456';
create user 'hive'@'192.168.1.%' identified by 'Hive@123456';
# 授权hive_metastore库全部权限(对应hive-site里的数据库名)
grant all privileges on hive_metastore.* to 'hive'@'localhost';
grant all privileges on hive_metastore.* to 'hive'@'192.168.1.%';
# 刷新权限立即生效
flush privileges;
# 验证权限
show grants for 'hive'@'192.168.1.%';
exit
1.6、初始化Hive metastore元数据
bash
#初始化Hive metastore元数据
#注意:由于schematool工具用于初始化当前Hive版本的Metastore数据。在这个过程中,可能会出现guava版本冲突的错误;这是因为hadoop与hive下所使用的guava版本不一致造成的,解决方法是:
#1-在正式初始化Hive metastore元数据前必须将【/data/bigdata/hadoop/current/share/hadoop/common/lib/】下的guava-32.0.1-jre.jar 替换【/data/bigdata/hive/current/lib/】下的guava-22.0.jar
cd /data/bigdata/hive/current/lib/
mv guava-22.0.jar guava-22.0.jar.old
cp /data/bigdata/hadoop/current/share/hadoop/common/lib/guava-32.0.1-jre.jar .
#2-正式初始化Hive metastore元数据
su - hadoop
schematool -dbType mysql -initSchema
#3-验证(存在【hive_metastore】数据库及其表则表示初始化成功)
mysql -uroot -p
show databases;
use hive_metastore;
show tables;
exit




二、启动Hive的metastore与hiveserver2服务
2.1、启动Hive的metastore服务
bash
#启动Hive【只在hivedb主机上操作】
#1-创建存放日志目录
mkdir -p /var/log/hive
chown -R hadoop:hadoop /var/log/hive
chmod 755 /var/log/hive
#2-修改hive的属主属组为hadoop
chown -R hadoop:hadoop /data/bigdata/hive
#2.1-创建hive-metastore服务
cat > /usr/lib/systemd/system/hive-metastore.service<<'EOF'
[Unit]
Description=Apache Hive Metastore Server
Documentation=https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
After=network.target syslog.target
# 依赖HDFS正常运行,根据集群实际情况调整
After=hadoop-hdfs-journalnode.service hadoop-hdfs-datanode.service
Wants=network-online.target
[Service]
Type=simple
User=hadoop
Group=hadoop
# Hive安装目录
Environment=HIVE_HOME=/data/bigdata/hive/current
Environment=HIVE_CONF_DIR=/data/bigdata/hive/current/conf
Environment=HADOOP_HOME=/data/bigdata/hadoop/current
# Java路径自行核对,替换集群真实JAVA_HOME
Environment=JAVA_HOME=/opt/openjdk/default
# 标准启动命令(调用hive内置脚本,自动加载hive-env.sh)
ExecStart=/data/bigdata/hive/current/bin/hive \
--hiveconf hive.log.dir=/var/log/hive \
--hiveconf hive.log.file=hivemetastore.log \
--service metastore
# 日志重定向输出至系统journald
StandardOutput=journal+console
StandardError=journal+console
# 进程异常重启策略
Restart=on-failure
RestartSec=5s
# 最多连续重启次数
StartLimitInterval=60s
StartLimitBurst=3
# 资源限制,防止进程耗尽服务器资源
LimitNOFILE=65535
LimitNPROC=4096
# OOM策略:进程被系统kill时标记失败
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF
#2.2-启动hive-metastore服务并设置开机自启
systemctl daemon-reload
systemctl start hive-metastore
systemctl status hive-metastore
systemctl enable hive-metastore
#2.3-检验hive-metastore服务启动是否正常
ps -ef | grep metastore
netstat -antlp | grep 9083
#若有问题则查看日志定位
tail -f /var/log/hive/hivemetastore.log
2.2、启动Hive的hiveserver2服务
若有程序通过JDBC/ODBC接口连接hive的话,就需要启动hiveserver2服务,否则不需要启动此服务,此服务启动后会开启10000和10002两个端口,10000端口用于jdbc、odbc远程连接,10002是hive的web ui界面,可以查看hive执行的sql以及任务运行状态。
注意:在启动hiveserver2服务之前,metastore服务是必须要启动的!
bash
#Hadoop集群中的所有节点都配置 core-site.xml 添加代理用户配置(允许 hadoop 用户代理)
cd /etc/hadoop/conf
vi core-site.xml
#【core-site.xml】文件末尾添加的内容如下
<!-- 添加代理用户配置(允许 hadoop 用户代理)-->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<!-- 新增:允许root代理用户,适配root启动HiveServer2 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
bash
#启动Hive的hiveserver2服务【只在hivedb主机上操作】
# 1. 创建缺失临时目录并授权
mkdir -p /opt/hive/tmp
chown -R hadoop:hadoop /opt/hive
chmod 777 /opt/hive/tmp
#1-配置hiveserver2服务
cat > /usr/lib/systemd/system/hive-hiveserver2.service << 'EOF'
[Unit]
Description=Apache HiveServer2 JDBC/ODBC Server
Documentation=https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Overview
After=network.target syslog.target hive-metastore.service
Wants=network-online.target
[Service]
Type=simple
User=hadoop
Group=hadoop
Environment=HIVE_HOME=/data/bigdata/hive/current
Environment=HIVE_CONF_DIR=/data/bigdata/hive/current/conf
Environment=HADOOP_HOME=/data/bigdata/hadoop/current
Environment=JAVA_HOME=/opt/openjdk/default
Environment=HADOOP_CLIENT_OPTS="-Dhive.log.dir=/var/log/hive -Dhive.log.file=hiveserver2.log"
ExecStart=/data/bigdata/hive/current/bin/hiveserver2
StandardOutput=journal+console
StandardError=journal+console
Restart=on-failure
RestartSec=5s
StartLimitInterval=60s
StartLimitBurst=3
LimitNOFILE=65535
LimitNPROC=4096
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF
#1.1-启动hiveserver2服务并设置开机自启
systemctl daemon-reload
systemctl start hive-hiveserver2
systemctl status hive-hiveserver2
systemctl enable hive-hiveserver2
#1.2-查看hiveserver2的进程
ps -ef | grep hiveserver2
netstat -antlp | grep 10000
#若有问题则查看日志定位
tail -f /var/log/hive/hiveserver2.log
2.3、配置Hive的客户端并启动测试
客户端配置Hive也是先按照《1.1-下载安装Hive》《1.2-配置Hive的环境变量》一样的操作,然后再按照如下配置操作:
bash
#配置Hive的客户端hive-site.xml【如在:slave002操作】
cd /data/bigdata/hive/current/conf
vi hive-site.xml
#【hive-site.xml】文件的完整内容
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- ==============================================
【核心元存储连接 | 官方强制客户端必配】
默认值:空(空=本地嵌入式metastore,Derby,生产禁用)
多metastore高可用逗号分隔:thrift://metastore-host1:9083,thrift://metastore-host2:9083
============================================== -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.1.169:9083</value>
<description>
Thrift URI list for remote metastore.
If empty, run metastore in embedded mode.
Hive 4.0.1 official template property.
</description>
</property>
<!-- ==========Metastore 客户端网络超时(默认:600 秒;生产调大为1200防止大元数据查询超时)======== -->
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>1200</value>
<description>Timeout in seconds for metastore client socket read.</description>
</property>
<!-- =========Metastore 客户端连接重试(默认值:0;生产开启重试应对瞬时服务抖动)============ -->
<property>
<name>hive.metastore.client.connect.retry.delay</name>
<value>5</value>
<description>Delay between metastore connection retries in seconds.</description>
</property>
<property>
<name>hive.metastore.client.connect.retry.limit</name>
<value>3</value>
<description>Max number of metastore connection retry attempts.</description>
</property>
<!-- =========Hive仓库根路径【必须和Metastore Server配置保持完全一致】(默认:/user/hive/warehouse)======== -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>Default location for managed database tables.</description>
</property>
<!-- ==========执行引擎配置 Hive4 默认 mr;生产推荐 spark / tez(可选值:mr, spark, tez)=========== -->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
<description>Execution engine for Hive queries.</description>
</property>
<!-- ==========Fetch任务优化:简单查询跳过MapReduce直接读取数据(可选:minimal / more / full)=========== -->
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description>
More mode: SELECT, FILTER, LIMIT can use fetch task without MR.
</description>
</property>
<property>
<name>hive.fetch.task.conversion.threshold</name>
<value>104857600</value>
<description>Max input bytes to enable fetch task conversion (100MB).</description>
</property>
<!-- ===========动态分区模式:生产非严格模式(默认 strict;strict禁止动态分区不带静态分区键)============ -->
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
<description>Dynamic partition mode: strict / nonstrict</description>
</property>
<property>
<name>hive.exec.max.dynamic.partitions</name>
<value>2000</value>
<description>Maximum total dynamic partitions per insert.</description>
</property>
<property>
<name>hive.exec.max.dynamic.partitions.pernode</name>
<value>500</value>
<description>Maximum dynamic partitions created per mapper/reducer node.</description>
</property>
<!-- ==============事务与ACID V2(Hive4原生支持)若业务不使用UPDATE/DELETE可关闭节省开销============ -->
<property>
<name>hive.support.concurrency</name>
<value>true</value>
<description>Enable concurrency locks for ACID tables.</description>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
<description>Transaction manager for ACID v2.</description>
</property>
<!-- ============MapReduce/Spark 并行度控制============ -->
<property>
<name>hive.exec.reducers.bytes.per.reducer</name>
<value>268435456</value>
<description>Target bytes per reducer: 256MB</description>
</property>
<property>
<name>hive.exec.reducers.max</name>
<value>1000</value>
<description>Max number of reducers auto-allocated.</description>
</property>
<!-- ===========ORC文件优化(数仓主流存储格式)============== -->
<property>
<name>hive.exec.orc.split.strategy</name>
<value>BI</value>
<description>ORC split strategy: ETALON / BI / HYBRID</description>
</property>
<property>
<name>hive.orc.cache.stripe.details</name>
<value>true</value>
</property>
<!-- ===========自动统计信息收集(CBO优化器依赖)================== -->
<property>
<name>hive.stats.autogather</name>
<value>true</value>
<description>Automatically compute statistics after INSERT/LOAD.</description>
</property>
<property>
<name>hive.stats.column.autogather</name>
<value>true</value>
</property>
<!-- ==============日志目录(客户端本地日志)按需修改为集群统一日志路径=========== -->
<property>
<name>hive.log.dir</name>
<value>/var/log/hive/client</value>
<description>Hive client local log directory.</description>
</property>
<property>
<name>hive.log.threshold</name>
<value>INFO</value>
</property>
<!-- ============关闭本地模式(生产集群必须关闭)=========== -->
<property>
<name>hive.exec.mode.local.auto</name>
<value>false</value>
<description>Auto switch to local mr mode, disable on production.</description>
</property>
<!-- ===========安全:禁止自动创建不存在的数据库目录============ -->
<property>
<name>hive.metastore.try.direct.sql.ddl</name>
<value>true</value>
</property>
</configuration>
bash
#启动Hive客户端
#1-进入hadoop用户下
su - hadoop
#2-使用belline连接hiveserver2进行操作测试
beeline -u jdbc:hive2://192.168.1.169:10000 -n hadoop
show databases;
show tables;
CREATE TABLE coffeemilk_test (id INT, `desc` STRING);
#注意若直接使用【CREATE TABLE coffeemilk_test (id INT, `desc` STRING);】命令报错"org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:file:/user/hive/warehouse/coffeemilk_test is not a directory or unable to create one)"则可以先手动指定hdfs路径执行查看,命令如下(若执行成功则永久解决方法是修改mysql数据库中的【hive_metastore】库下dbs表default的DB_LOCATION_URI内容为【hdfs://bigdata/user/hive/warehouse】)
CREATE TABLE coffeemilk_test (id INT, `desc` STRING)
LOCATION 'hdfs://bigdata/user/hive/warehouse/coffeemilk_test';
#注意:这里通过beline连接hiveserver2的操作创建的表其实是在hadoop集群的hdfs中下的【/user/hive/warehouse/】目录下创建了对应的目录【coffeemilk_test】可在任意hadoop节点切换到hadoop用户下查看
#要想隐藏查看hdfs命令后显示内容的警告内容则可以在后面添加【2>/dev/null】(如:hadoop fs -ls /2>/dev/null)
su - hadoop
hadoop fs -ls /
hadoop fs -ls /user
hadoop fs -ls /user/hive
hadoop fs -ls /user/hive/warehouse





注意 :若在客户端使用【beeline -u jdbc:hive2://192.168.1.169:10000 -n hadoop】命令连接上hive后使用【CREATE TABLE coffeemilk_test (id INT, `desc` STRING)】命令创建表报错"org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:file:/user/hive/warehouse/coffeemilk_test is not a directory or unable to create one)"则是由于hive-site.xml或者【hivemetastore-site.xml】文件中的【hive.metastore.warehouse.dir】下的值是【/user/hive/warehouse】(缺少 hdfs://bigdata)因此报错;修复方法如下:(最后修复完成后由于真正负责创建 HDFS 目录的是 metastore 服务进程!,因此需要重启hive-metastore服务与hive-hiveserver2服务)。

bash
#修复连接到hive创建表报错"Caused by: org.apache.hadoop.hive.metastore.api.MetaException: file:/user/hive/warehouse/coffeemilk_test is not a directory or unable to create one"方法
#1-进入hive metastore所在服务器的配置路径查看hive-site.xml或者【hivemetastore-site.xml】文件中的【hive.metastore.warehouse.dir】下的值是否【/user/hive/warehouse】(缺少 hdfs://bigdata)缺少则添加上
cd /data/bigdata/hive/current/conf
#在【hive-site.xml】【hivemetastore-site.xml】文件顶部配置如下内容
<!-- 强制Metastore读取HDFS仓库路径,放在最前面 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://bigdata/user/hive/warehouse</value>
</property>
#2-强制修正hive使用的mysql数据库中hdfs的路径为hadoop的hdfs路径
#2.1-查看mysql数据库
mysql -uroot -p
use hive_metastore;
#2.2-可以看到dbs表中的【DB_LOCATION_URI】字段内容是【file:/user/hive/warehouse】这就是导致使用不了hdfs的原因
select * from dbs;
#2.3-直接修改DB_LOCATION_URI内容为【hdfs://bigdata/user/hive/warehouse】
update dbs
set DB_LOCATION_URI='hdfs://bigdata/user/hive/warehouse'
where NAME='default';



三、Hive的常用SQL操作
3.1、Hive的常用SQL操作
bash
#Hive中的SQL常用操作
#1-创建表、修改表、显示表(示例如下)
#1.1-创建表
create table ck_test(id int, name string,sex int);
create table hive_table (id string, ip string,pt string) partitioned by (dt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
#1.2-查看所有表
show tables;
#1.3-要更改表名【语法:ALTER TABLE A RENAME TO B】
alter table ck_test rename to ckk_test;
#2-映射数据到表中(可通过【 hadoop fs -ls /user/hive/warehouse/hive_table 2>/dev/null 】命令在hadoop任意节点查看dhfs信息)
#2.1-将本地的【/home/hadoop/text.txt】文件上传到hive的hive_table表中(即hadoop的HDFS中)
load data local inpath '/home/hadoop/text.txt' overwrite into table hive_table partition (dt='2026-07-27');
#2.2-将hive中的文件导入到hive的hive_table表中(即hadoop的HDFS中;相当于mv操作)
load data inpath '/logs/coffeemilk.log' overwrite into table hive_table partition (dt='2026-07-27');
#3-Hive查询(实际上是调用hadoop的yarn进行计算)
#注意:执行select count(1)查询的话,就会走mapreduce,而如果执行select * from test_table的话,是不会走mapreduce的。
select count(*) from hive_table;
select * from hive_table;
select count(1) from hive_table;


3.2、beeline的使用
bash
#beline的登录命令语法【beeline -u jdbc:hive2://hiveserver2所在服务器域名或IP:10000 -n 登录用户名】
beeline -u jdbc:hive2://slave003:10000 -n hadoop
beeline -u jdbc:hive2://192.168.1.169:10000 -n hadoop
默认情况下HiveServer2执行查询时使用的用户是提交查询的用户,这需要设置相关用户权限,比较麻烦,因此,在hive-site.xml中加入以下配置:
#hive.server2.enable.doAs=false表示【保持 false,则所有任务永远以 hadoop 用户运行】(HiveServer2 进程是 hadoop 用户启动 → 所有 SQL 实际执行者:hadoop)
#⚠️ 弊端:任何人 beeline 连接进来,都是 hadoop 身份,多租户环境无权限隔离,生产不建议。
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
也就是将hive.server2.enable.doAs选项设置为false,那么,查询将会使用运行hiveserver2进程的用户。这样就免去了对用户权限的设定,使用简单很多。添加这个配置后,重新启动hiveserver2、metastore服务,就可以使用如下方式连接beeline了。