hive 集群部署

1. 环境准备

准备三台主机:可以参考:linux-centos7 集群环境搭建

安装 hadoop:可以参考:hadoop3 完全分布式安装

2. 下载软件

点击下载

上传安装包到 /opt/software 目录

image-20231203005048748

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

初始化完成后生成下方目录

image-20231203010024505

启动客户端,进行操作

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 路径下获取

image-20231203223224336

查看是否上传成功

cd /opt/module/lib
ll

image-20240407154408842

添加数据库配置 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 &

image-20231203230007316

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: 密码可以忽略直接回车即可

image-20231203230614220

3.7. 使用 dbeaver 连接(推荐)

image-20231203231246026

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;
        }
    }
}


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值