大数据Hadoop运维应用实践——HIVE与Hadoop实现整合_Hive的配置安装与使用

大数据Hadoop运维应用实践------HIVE与Hadoop实现整合_Hive架构与组件解析https://blog.csdn.net/xiaochenXIHUA/article/details/163171639

一、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&amp;useSSL=false&amp;allowMultiQueries=true&amp;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了。

相关推荐
huameinan狮子2 小时前
微服务化的基石——持续集成
大数据·ci/cd·微服务
LONGZETECH2 小时前
工业实训仿真设计实践:电机拆装软件的 DAG 流程建模、工具精度分级与数据体系搭建
大数据·算法·unity·架构·汽车
weixin199701080162 小时前
2026年反向海淘独立站洗牌期:生存法则与终局推演
大数据·人工智能
LuminWave3 小时前
资本扎堆灵巧手赛道,数据基建成为规模化落地关键变量
大数据·人工智能·具身智能·灵巧手·tof相机
钒星物联网3 小时前
北斗二号停服倒计时!磐钴提供五大升级服务
大数据·网络
Databend3 小时前
从全表排序到概率统计:Databend 如何用 KLL、Top-N 与 CMS 改进基数估计
大数据·数据库·算法
xialage1683 小时前
服装辅料厂家生成式引擎GEO优化之时机、价值与落地路径
大数据·百度
无忧.芙桃4 小时前
MySQL数据库原理与实践(四):基本查询
大数据·数据库·mysql
A15362554 小时前
五金批发电商业财一体化 ERP 推荐:打通订单、库存、财务对账
大数据·运维·人工智能·零售