1. 环境准备
准备三台主机:可以参考:linux-centos7 集群环境搭建
安装 hadoop:可以参考:hadoop3 完全分布式安装
2. 下载软件
上传安装包到 /opt/software 目录
3. 安装
3.1. 解压重命名
cd /opt/software
tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/module
cd /opt/module
mv apache-hive-3.1.3-bin/ hive
3.2. 解决冲突
我们在启动项目时发下了下面的异常
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
2024-04-07 16:04:55,725 INFO [main] conf.HiveConf (HiveConf.java:findConfigFile(187)) - Found configuration file file:/opt/module/hive/conf/hive-site.xml
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
从中我们可以看出第一个异常是 SLF4J 的冲突,存在多实现,因为 hive 依赖 hadoop,二者都有日志的实现,所以出现了冲突
我们只需要将 hive 中的相关 jar 去掉即可(这种情况下我们建议以底层的为准,所以建议修改上层的 hive)
hive 依赖包的位置:/opt/module/hive/lib
# 将冲突的依赖包改名
mv /opt/module/hive/lib/log4j-slf4j-impl-2.17.1.jar /opt/module/hive/lib/log4j-slf4j-impl-2.17.1.jar.bak
从中我们可以看出第二个异常是 google Guava 库中的一个类不存在导致,笔者这边看了 hive 依赖的是 guava-19.0.jar,而 guava-27.0-jre.jar,二者的版本差异很大,笔者这边选择 去掉 hive 的依赖,将 hadoop 的依赖拷贝的 hive 的 lib 目录
hadoop 依赖包的位置:/opt/module/hadoop/share/hadoop/common/lib
# 将冲突的依赖包改名
mv /opt/module/hive/lib/guava-19.0.jar /opt/module/hive/lib/guava-19.0.jar.bak
# 将 hadoop 使用的依赖拷贝到 hive 的依赖库中
cp /opt/module/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/module/hive/lib/
3.3. 内置 derby 初始化(测试)
初始化源数据库
cd /opt/module/hive
./bin/schematool -initSchema -dbType derby
初始化完成后生成下方目录
启动客户端,进行操作
ps:启动 hive 时,如果我们启动的 hadoop 集群给的内存太小时,这里会内存溢出,建议给到 256 MB 以上
./bin/hive
# 执行一些语句
show databases;
show tables;
create table stu(id int, name string);
insert into stu(1, 'ss');
select * from stu;
3.4. 外置 mysql 初始化(推荐)
上传 mysql 的 jdbc 依赖包 到 lib 目录下
获取方式,可以直接在常用的 maven 本地仓库的 /mysql/mysql-connector-java 路径下获取
查看是否上传成功
cd /opt/module/lib
ll
添加数据库配置 vim ./conf/hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- mysql 数据库连接地址 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://mitchell-101:3306/hive</value>
</property>
<!-- mysql 数据库驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- mysql 数据库账号 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- mysql 数据库密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>920619</value>
</property>
<!-- hive 数据的 hdfs 保存地址 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
</configuration>
初始化数据库
./bin/schematool -dbType mysql -initSchema -verbose
ps:注意在初始化之前删除用 derby 产生的数据文件夹
3.5. 部署 hiveserver2
修改 hadoop 配置文件
cd /opt/module/hadoop-3.3.4/
vim etc/hadoop/core-site.xml
添加下方内容
<!-- 配置所有节点的 mitchell 用户都可以作为代理用户 -->
<property>
<name>hadoop.proxyuser.mitchell.hosts</name>
<value>*</value>
</property>
<!-- 配置 mitchell 用户能够代理的组为任意组 -->
<property>
<name>hadoop.proxyuser.mitchell.groups</name>
<value>*</value>
</property>
<!-- 配置 mitchell 用户能够代理用户为任意用户 -->
<property>
<name>hadoop.proxyuser.mitchell.users</name>
<value>*</value>
</property>
修改 hive 配置文件
cd /opt/module/hive
vim ./conf/hive-site.xml
添加下方内容
<!-- 指定 hiveserver2 连接的 host,可以配置为 0.0.0.0 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>mitchell-101</value>
</property>
<!-- 指定 hiveserver2 连接的 端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- 启用多用户 访问和修改 Hive 表 -->
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<!-- 启用强制执行表分桶,可以提高某些查询性能 -->
<property>
<name>hive.enforce.bucketing</name>
<value>true</value>
</property>
<!-- 动态分区模式,nonstrict 表示只有在写入数据分区不存在时才会创建 -->
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
</property>
<!-- 数据库事务管理器,支持 ACID(Atomicity, Consistency, Isolation, Durability) 特性 -->
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<!-- 启用 Hive 表压缩器的初始程序 -->
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
<!-- 压缩器 占用的工作线程数 -->
<property>
<name>hive.compactor.worker.threads</name>
<value>1</value>
</property>
启动服务
# 前台启动
./bin/hiveserver2
# 后台启动
nohup ./bin/hiveserver2 1>/dev/null 2>&1 &
3.6. 使用 beeline 连接
beeline 是 hive 内置的一个链接 hiveserver2 的程序
./bin/beeline
# 输入下方命令链接
beeline> !connect jdbc:hive2://mitchell-101:10000
Connecting to jdbc:hive2://mitchell-101:10000
Enter username for jdbc:hive2://mitchell-101:10000: mitchell
Enter password for jdbc:hive2://mitchell-101:10000: 密码可以忽略直接回车即可
3.7. 使用 dbeaver 连接(推荐)
3.8. 其他一些相关配置
# 主配置文件,当前配置文件已经过期,文件中的内容仅供参考
# 后续起作用的配置全部写在 hive-site.xml
mv ./conf/hive-default.xml.template ./conf/hive-default.xml
vim ./conf/hive-site.xml
# 启用日志配置文件
mv ./conf/hive-log4j2.properties.template ./conf/hive-log4j2.properties
4. 高可用,负载均衡
其实 hive 的性能主要是由 hadoop 的性能好坏决定,所以一般有三个实例保证服务能正常使用即可,
过多的实例对性能的提高不大,我们可以启动三个 hiveserver2 实例
并通过 nginx 的负载均衡策略将多个实例集中到一起
相关配置片段:
http {
# 将全部实例集中到这里
upstream hiveserver2 {
server mitchell-101:10000;
server mitchell-101:10000;
server mitchell-101:10000;
}
# 监听端口,路由,将特定的请求转发给 hiveserver2 实例
server {
listen 80;
server_name my.hive.com;
location / {
proxy_pass http://hiveserver2;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}