Ubuntu26.04-Hadoop3.5.0搭建hive4.2.0
准备
HDFS配置
bash
vim $HADOOP_HOME/etc/hadoop/core-site.xml
xml
<!--配置所有节点的lhz用户都可作为代理用户-->
<property>
<name>hadoop.proxyuser.lhz.hosts</name>
<value>*</value>
</property>
<!--配置lhz用户能够代理的用户组为任意组-->
<property>
<name>hadoop.proxyuser.lhz.groups</name>
<value>*</value>
</property>
<!--配置lhz用户能够代理的用户为任意用户-->
<property>
<name>hadoop.proxyuser.lhz.users</name>
<value>*</value>
</property>
启动Hadoop
bash
# 启动hadoop
start-hadoop.sh
# 检查hadoop进程
jps
# 检查各端口
netstat -aplnt | grep java
安装MySQL
升级软件列表
bash
sudo apt update
升级内核和软件
bash
sudo apt -y dist-upgrade
在线安装MySQL
bash
sudo apt -y install mysql-server
修改mysql密码
-
登录MySQL
bashsudo mysql -u root -
修改MySQL密码
sql-- 查看现有root用户 SELECT user, host, plugin FROM mysql.user WHERE user='root'; -- 修改root@localhost的认证方式为密码认证 ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'lihaozhe'; FLUSH PRIVILEGES;
设置MySQL远程访问
-
登录MySQL后,修改现有用户的host
sqlUPDATE mysql.user SET host='%' WHERE user='root' AND host='localhost'; FLUSH PRIVILEGES; -
修改MySQL配置文件
bashsudo vim /etc/mysql/mysql.conf.d/mysqld.cnf找到并修改
bind-addressbash# 将这行: bind-address = 127.0.0.1 # 改为: bind-address = 0.0.0.0 # 或者注释掉这行(#bind-address = 127.0.0.1)
重启MySQL服务
bash
sudo systemctl restart mysql
远程客户端测试
bash
mysql -h lihaozhe03 -uroot -p
安装hive
bash
# 将软件上传到 /home/lhz/opt 目录
wget -P ~/opt https://dlcdn.apache.org/hive/hive-4.2.0/apache-hive-4.2.0-bin.tar.gz
# 解压hive
tar -zxvf ~/opt/apache-hive-4.2.0-bin.tar.gz -C ~/opt
# 目录改名
mv ~/opt/apache-hive-4.2.0-bin ~/opt/hive-4
# 进入配置文件目录
cd ~/opt/hive-4/conf
# 编辑环境配置文件
vim hive-env.sh
# 编辑配置文件
vim hive-site.xml
hive-env.sh
hadoop 安装路径 export HADOOP_HOME=/home/lhz/opt/hadoop-3/
hive 配置文件路径 export HIVE_CONF_DIR=/home/lhz/opt/hive-4/conf/****
bash
export JAVA_HOME=/home/lhz/opt/jdk-25
export HADOOP_HOME=/home/lhz/opt/hadoop-3/
export HIVE_CONF_DIR=/home/lhz/opt/hive-4/conf/
hive-site.xml
需要修改的位置提炼如下:
xml
<configuration>
<!-- ======== MetaStore 元数据库连接 (MySQL) ======== -->
<!-- 元数据库 JDBC 连接 URL (MySQL, utf8 编码, 禁用 SSL) -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://lihaozhe03:3306/hive?allowPublicKeyRetrieval=true&useUnicode=true&createDatabaseIfNotExist=true&characterEncoding=UTF8&useSSL=false&useServerPrepStmts=false&rewriteBatchedStatements=true&cachePrepStmts=true&allowMultiQueries=true&serverTimeZone=Asia/Shanghai&sslMode=DISABLED</value>
</property>
<!-- JDBC 驱动类: MySQL Connector/J 8.x -->
<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>lihaozhe</value>
</property>
<!-- ======== 数据仓库目录 ======== -->
<!-- Hive 表数据在 HDFS 上的默认存储根目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- ======== 临时 / 下载目录 ======== -->
<!-- MR 任务在 HDFS 上的临时工作目录 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
</property>
<!-- MR 任务在本地节点上的临时工作目录 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/lhz/data/hive/local</value>
<description>Local scratch space for Hive jobs</description>
</property>
<!-- ADD JAR/FILE 时资源下载到本地的暂存目录 -->
<property>
<name>hive.downloaded.resources.dir</name>
<value>/home/lhz/data/hive/resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<!-- ======== 日志 ======== -->
<!-- 查询日志在 HDFS 上的存放路径 -->
<property>
<name>hive.querylog.location</name>
<value>/user/hive/log</value>
</property>
<!-- ======== MetaStore 服务 ======== -->
<!-- 远程 MetaStore 服务 URI (空表示使用内嵌模式, 当前为本地 MetaStore) -->
<property>
<name>hive.metastore.uris</name>
<!--<value>thrift://lihaozhe03:9083</value>-->
<value/>
</property>
<!-- ======== HiveServer2 服务端口与绑定地址 ======== -->
<!-- HiveServer2 Thrift 监听端口 (beeline / JDBC 客户端连接此端口) -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- HiveServer2 绑定的网络地址 (0.0.0.0 表示监听所有网卡) -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
<!-- HiveServer2 Web UI 绑定的地址 -->
<property>
<name>hive.server2.webui.host</name>
<value>0.0.0.0</value>
</property>
<!-- HiveServer2 Web UI 端口 (浏览器访问 http://localhost:10002) -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<!-- ======== HiveServer2 会话与安全 ======== -->
<!-- 长轮询(异步执行)超时时间, 客户端等待查询结果的超时 -->
<property>
<name>hive.server2.long.polling.timeout</name>
<value>5000ms</value>
</property>
<!-- 启用用户代理(doAs): 以提交查询的用户身份而非 HiveServer2 进程用户执行 MR 任务 -->
<property>
<name>hive.server2.enable.doAs</name>
<value>true</value>
</property>
<!-- ======== DataNucleus(ORM) 配置 - 当前已注释 ======== -->
<!--
<property>
<name>datanucleus.autoCreateSchema</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>true</value>
</property>
-->
<!-- ======== 执行引擎与杂项 ======== -->
<!-- 查询执行引擎: mr / tez / spark (当前使用 MapReduce) -->
<property>
<name>hive.execution.engine</name>
<value>mr</value>
</property>
<!-- 跳过 MetaStore schema 版本校验 (不同版本兼容时可设为 false) -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- HiveServer2 操作日志本地路径 -->
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/home/lhz/data/hive/tmp/operation_logs</value>
</property>
<!-- 辅助 JAR 路径, 通过分布式缓存传递给 YARN MR 容器 classpath -->
<property>
<name>hive.aux.jars.path</name>
<value>file:///home/lhz/opt/hive-4/lib/commons-collections-3.2.2.jar</value>
</property>
</configuration>
注意:上面配置文件中的路径在 vi 编辑器下 全局替换 本案例已经替换过了无需执行
bash:%s@\${system:java.io.tmpdir}@/tmp/hive-log@g不要使用图形化 不然每次保存后3215行都会有个  特殊字符 如果产生删除即可 具体报错信息 后面有单独的描述
配置环境变量
bash
vim ~/.profile
bash
export HIVE_HOME=/home/lhz/opt/hive-4
export HCATALOG_HOME=/home/lhz/opt/hive-4/hcatalog
export PATH=$PATH:$HIVE_HOME/bin:$HCATALOG_HOME/bin:$HCATALOG_HOME/sbin
完整
bash
export NODE_HOME=$HOME/opt/node-v24
export JAVA_HOME=$HOME/opt/jdk-25
export MAVEN_HOME=$HOME/opt/maven
export SCALA_HOME=$HOME/opt/scala-2
export ZOOKEEPER_HOME=$HOME/opt/zookeeper-3
export HDFS_NAMENODE_USER=lhz
export HDFS_SECONDARYNAMENODE_USER=lhz
export HDFS_DATANODE_USER=lhz
export HDFS_ZKFC_USER=lhz
export HDFS_JOURNALNODE_USER=lhz
export HADOOP_SHELL_EXECNAME=lhz
export YARN_RESOURCEMANAGER_USER=lhz
export YARN_NODEMANAGER_USER=lhz
export HADOOP_HOME=$HOME/opt/hadoop-3
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native
export HIVE_HOME=/home/lhz/opt/hive-4
export HCATALOG_HOME=/home/lhz/opt/hive-4/hcatalog
export PATH=$PATH:$NODE_HOME/bin:$JAVA_HOME/bin:$MAVEN_HOME/bin:$SCALA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HCATALOG_HOME/bin:$HCATALOG_HOME/sbin
bash
source ~/.profile
上传 MySQL 连接驱动 jar 包到 hive 安装目录的lib目录下:
$HIVE_HOME/lib
删除原有的 protobuf-java-3.25.5.jar 文件
上传 jar 包有两个 分别为:
- mysql-connector-j-9.7.0.jar
- protobuf-java-4.35.0.jar
bash
rm -f $HIVE_HOME/lib/protobuf-java-3.25.5.jar
guava版本冲突
删除 hive/lib目录中的 guava-22.0.jar
拷贝hadoop/share/hadoop/common/lib目录中的 guava-33.4.8-jre.jar 到 hive/lib 目录
bash
rm -f $HIVE_HOME/lib/guava-22.0.jar
cp -v $HADOOP_HOME/share/hadoop/common/lib/guava-33.4.8-jre.jar $HIVE_HOME/lib
初始化hive的元数据库
注意 :初始初始元数据库之前 保证 hadoop 和 mysql 正常启动
推荐现在mysql 手动创建 hive 元数据库
sql
create database hive default character set utf8;
Linux控制台执行以下命令初始化 hive 元数据库
bash
schematool -initSchema -dbType mysql -verbose
报错解解决:
bash
Exception in thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
at [row,col,system-id]: [3215,96,"file:/usr/local/hive/conf/hive-site.xml"]
at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3051)
...
at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
at [row,col,system-id]: [3215,96,"file:/usr/local/hive/conf/hive-site.xml"]
at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:621)
...
at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3034)
... 17 more
报错原因:
hive-site.xml配置文件中,3215行(见报错记录第二行)有特殊字符
解决办法:
进入hive-site.xml文件,跳转到对应行,删除里面的  特殊字符即可
bash
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
at java.net.URI.checkPath(URI.java:1822)
at java.net.URI.<init>(URI.java:745)
at org.apache.hadoop.fs.Path.initialize(Path.java:260)
解决方案:将hive-site.xml配置文件的
hive.querylog.location
hive.exec.local.scratchdir
hive.downloaded.resources.dir
三个值(原始为$标识的相对路径)写成绝对值
bash
# 全局替换
:%s@\${system:java.io.tmpdir}@/tmp/hive-log@g
中文乱码
bash
mysql -uroot -p
sql
use hive;
sql
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
flush privileges;
远程模式
lihaozhe03
bash
hive --service metastore
hive --service hiveserver2
# hive --service hiveserver2 与 hiveserver2 start 作用相同
# 启动服务端 后台运行
hive --service metastore &
hive --service hiveserver2 &
# 启动服务端 后台运行
nohup hive --service metastore > /dev/null 2>&1 &
nohup hive --service hiveserver2 > /dev/null 2>&1 &
bash 中 0、1、2 三个数字分别代表 STDIN_FILENO 、 STDOUT_FILENO 、STDERR_FILENO ,
即标准输入(一般是键盘),
标准输出(一般是显示屏,准确的说是用户终端控制台),
标准错误(输出错信息输出)。
| 数字 | 含义 |
|---|---|
| 0 | 标准输入(一般是键盘) |
| 1 | 标准输出(一般是显示屏,准确的说是用户终端控制台) |
| 2 | 标准错误(输出错信息输出) |
/dev/null看作"黑洞". 它等价于一个只写文件.
所有写入它的内容都会永远丢失.
而尝试从它那儿读取内容则什么也读不到
启动hive脚本
bash
nohup hive --service metastore > /dev/null 2>&1 &
nohup hive --service hiveserver2 > /dev/null 2>&1 &
为脚本添加可执行权限
bash
chmod +x start-hive.sh
分发启动脚本
bash
mv start-hive.sh /home/lhz/opt/hive-4/bin/
客户端连接
beeline 连接
bash
beeline -u jdbc:hive2://lihaozhe03:10000 -n root
beeline --silent=true -u jdbc:hive2://lihaozhe03:10000 -n lhz
beeline 连接参数
bash
Option Description
--autoCommit=[true/false] ---进入一个自动提交模式:beeline --autoCommit=true
--autosave=[true/false] ---进入一个自动保存模式:beeline --autosave=true
--color=[true/false] ---显示用到的颜色:beeline --color=true
--delimiterForDSV= DELIMITER ---分隔值输出格式的分隔符。默认是"|"字符。
--fastConnect=[true/false] ---在连接时,跳过组建表等对象:beeline --fastConnect=false
--force=[true/false] ---是否强制运行脚本:beeline--force=true
--headerInterval=ROWS ---输出的表间隔格式,默认是100: beeline --headerInterval=50
--help ---帮助 beeline --help
--hiveconf property=value ---设置属性值,以防被hive.conf.restricted.list重置:beeline --hiveconf prop1=value1
--hivevar name=value ---设置变量名:beeline --hivevar var1=value1
--incremental=[true/false] ---输出增量
--isolation=LEVEL ---设置事务隔离级别:beeline --isolation=TRANSACTION_SERIALIZABLE
--maxColumnWidth=MAXCOLWIDTH ---设置字符串列的最大宽度:beeline --maxColumnWidth=25
--maxWidth=MAXWIDTH ---设置截断数据的最大宽度:beeline --maxWidth=150
--nullemptystring=[true/false] ---打印空字符串:beeline --nullemptystring=false
--numberFormat=[pattern] ---数字使用DecimalFormat:beeline --numberFormat="#,###,##0.00"
--outputformat=[table/vertical/csv/tsv/dsv/csv2/tsv2] ---输出格式:beeline --outputformat=tsv
--showHeader=[true/false] ---显示查询结果的列名:beeline --showHeader=false
--showNestedErrs=[true/false] ---显示嵌套错误:beeline --showNestedErrs=true
--showWarnings=[true/false] ---显示警告:beeline --showWarnings=true
--silent=[true/false] ---静默方式执行,不显示执行过程信息:beeline --silent=true
--truncateTable=[true/false] ---是否在客户端截断表的列
--verbose=[true/false] ---显示详细错误信息和调试信息:beeline --verbose=true
-d <driver class> ---使用一个驱动类:beeline -d driver_class
-e <query> ---使用一个查询语句:beeline -e "query_string"
-f <file> ---加载一个文件:beeline -f filepath 多个文件用-e file1 -e file2
-n <username> ---加载一个用户名:beeline -n valid_user
-p <password> ---加载一个密码:beeline -p valid_password
-u <database URL> ---加载一个JDBC连接字符串:beeline -u db_URL
hive 连接
bash
hive
启动客户端后连接
bash
!connect jdbc:hive2://lihaozhe3:10000 -n lhz
浏览器访问

关闭 hive 脚本
编写 stop-hive.sh 脚本 kill 掉后台 RunJar 进程
bash
#!/bin/bash
# 查找并杀死所有 RunJar 进程
pids=$(ps -ef | grep RunJar | grep -v grep | awk '{print $2}')
# 检查是否有找到任何 PID
if [ -n "$pids" ]; then
# 按行kill并输出
for pid in $pids; do
echo "Killing the following RunJar processes PID: $pid"
kill -9 $pid
done
else
echo "No RunJar processes found."
fi
脚本添加可执行权限
bash
chmod +x stop-hive.sh
分发脚本
bash
mv stop-hive.sh /home/lhz/opt/hive-4/bin/
体验
sql
use default;
create table person (
id int,
phonenum bigint,
salary decimal(16, 2),
name string
);
show tables;
insert into person values (1001,13966668888,9999.99,"张三");
bash
vim /home/lhz/person.txt
内容如下:
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19
longlong,pingping_liuliu,xiao long:8_xiaoxiao long:9
drop table person;
create table person (
name string,
friends array<string>,
childrens map<string,int>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
sql
load data local inpath '/home/lhz/person.txt' into table person;
sql
drop table data;
create table data (
name string,
amount int
)
row format delimited fields terminated by ','
lines terminated by '\n';
load data local inpath '/home/lhz/data.txt' into table data;
sql
select count(*) from data;
select count(*) from data group by name;
select name,max(t) from data group by name;
select name,max(t) from data group by name order by max(t) ;
sql
# 本地
set mapreduce.framework.name=local;
set hive.exec.mode.local.auto=true;
# yarn
set mapreduce.framework.name=yarn;
set hive.exec.mode.local.auto=false;
# 向量模式
set hive.vectorized.execution.enabled=true;
set hive.vectorized.execution.enabled=false;
set mapreduce.framework.name=local;
set hive.exec.mode.local.auto=true;
set hive.vectorized.execution.enabled=true;
同步hive到其它节点
停止hive服务,执行以下命令,这样在任意集群节点都可以启动hive
bash
scp -rv ~/opt/hive-4 lhz@lihaozhe01:~/opt
scp -rv ~/opt/hive-4 lhz@lihaozhe02:~/opt
配置环境变量
bash
export NODE_HOME=$HOME/opt/node-v24
export JAVA_HOME=$HOME/opt/jdk-25
export MAVEN_HOME=$HOME/opt/maven
export SCALA_HOME=$HOME/opt/scala-2
export ZOOKEEPER_HOME=$HOME/opt/zookeeper-3
export HDFS_NAMENODE_USER=lhz
export HDFS_SECONDARYNAMENODE_USER=lhz
export HDFS_DATANODE_USER=lhz
export HDFS_ZKFC_USER=lhz
export HDFS_JOURNALNODE_USER=lhz
export HADOOP_SHELL_EXECNAME=lhz
export YARN_RESOURCEMANAGER_USER=lhz
export YARN_NODEMANAGER_USER=lhz
export HADOOP_HOME=$HOME/opt/hadoop-3
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native
export HIVE_HOME=/home/lhz/opt/hive-4
export HCATALOG_HOME=/home/lhz/opt/hive-4/hcatalog
export PATH=$PATH:$NODE_HOME/bin:$JAVA_HOME/bin:$MAVEN_HOME/bin:$SCALA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HCATALOG_HOME/bin:$HCATALOG_HOME/sbin