1. hive on tez运行
在Hive2.x版本起,Hive官方不再建议使用MapReduce作为底层默认执行引擎,推荐使用Tez或者Spark作为执行引擎(目前Hive4.0.0版本不支持Spark引擎),这些引擎相比于默认的MapReduce执行引擎执行任务时可以提升查询性能、降低延迟并优化资源利用,Hive4.x版本后可能会彻底弃用MapReduce引擎。
Apache Tez是一个开源分布式执行框架,专为处理复杂数据流任务而设计。它允许将多个依赖任务转化为单一的有向无环图(DAG)作业,从而大幅提升性能。Tez构建在Hadoop YARN之上,主要用于提升Hive应用的查询处理性能,替代传统的MapReduce执行引擎,实现更高效的数据处理。
Tez能够将过去需要多个MapReduce作业的数据处理任务,现在简化为一个Tez作业。这种改进不仅简化了作业管理,还显著提升了执行性能。
1.0 前置依赖
hive搭建和启动脚本https://blog.csdn.net/weixin_62206215/article/details/152001251?spm=1011.2124.3001.6209
1.1 下载并上传tez
从tez官网下载tez,地址:https://tez.apache.org/releases/index.html,这里选择的tez版本为0.10.3版本,下载好的安装包名称为"apache-tez-0.10.3-bin.tar.gz"。
将tez安装包下载后,上传至hadoop101节点/opt/software目录下并解压:
#上传并解压至/software目录下
[root@hadoop101 ~]# ls /opt/software/ | grep apache-tez*
apache-tez-0.10.3-bin
apache-tez-0.10.3-bin.tar.gz
1.2 将tez安装包上传至HDFS路径中
后续在Hive中使用tez时需要获取tez 相关库文件,需要指定tez安装包,这里在HDFS中创建tez目录,然后将tez安装包上传至HDFS该路径中。
#HDFS中创建tez目录
[root@hadoop101 software]# hdfs dfs -mkdir /tez
#上传tez安装包到HDFS/tez目录中
[root@hadoop101 software]# hdfs dfs -put ./apache-tez-0.10.3-bin.tar.gz /tez/tez.tar.gz
1.3 配置tez-site.xml
在HIVE_HOME/conf目录下创建tez-site.xml文件,配置如下内容:
<configuration>
<!--指定Tez库文件的位置 -->
<property>
<name>tez.lib.uris</name>
<value>hdfs://mycluster/tez/tez.tar.gz</value>
</property>
<!--是否使用集群上的Hadoop库 -->
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>true</value>
</property>
</configuration>
也可在该配置文件中加入如下配置项指定tez使用的资源情况:
... ...
<!-- 设置Tez Application Master的内存大小(以MB为单位)-->
<property>
<name>tez.am.resource.memory.mb</name>
<value>1024</value>
</property>
<!-- 设置Tez Application Master的CPU核心数量 -->
<property>
<name>tez.am.resource.cpu.vcores</name>
<value>1</value>
</property>
<!-- 设置Tez容器最大Java堆内存占总内存的比例 -->
<property>
<name>tez.container.max.java.heap.fraction</name>
<value>0.4</value>
</property>
<!-- 设置Tez任务的内存大小(以MB为单位) -->
<property>
<name>tez.task.resource.memory.mb</name>
<value>1024</value>
</property>
<!-- 设置Tez任务的CPU核心数量 -->
<property>
<name>tez.task.resource.cpu.vcores</name>
<value>1</value>
</property>
... ...
1.4 准备tez jars
在HIVE_HOME/目录中创建jars目录,将tez安装包中的所有jar放入到该目录中,后续Hive On Tez需要使用到这些jar包。
#在node1 HIVE_HOME中创建jars目录
[root@hadoop101 ~]# mkdir -p /opt/module/hive-4.0.0/jars
#将所有tez相关jar放入到HIVE_HOME/jars目录下
[root@hadoop101 ~]# cp /opt/software/apache-tez-0.10.3-bin/*.jar /opt/module/hive-4.0.0/jars
[root@hadoop101 ~]# cp /opt/software/apache-tez-0.10.3-bin/lib/*.jar /opt/module/hive-4.0.0/jars
1.5 配置hive-env.sh
配置HIVE_HOME/conf/hive-env.sh文件,在最后配置"HIVE_AUX_JARS_PATH"属性指定Tez jar路径为HIVE_HOME/jars路径。
... ...
export HIVE_AUX_JARS_PATH=/opt/module/hive-4.0.0/jars
... ...
1.6 配置hive-site.xml使用tez引擎
在hive-site.xml中最后加入如下配置项使用tez引擎。
... ...
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
... ...
1.7 重启Hive Metastore和HiveServer服务进行测试
重启Hive Metastore和HiveServer服务。
[root@hadoop101 conf]# hive-service.sh restart
------------------------------------------------------------
正在重启 Hive 服务...
------------------------------------------------------------
正在停止 Hive hiveserver2...
成功:Hive hiveserver2 (PID: 16388) 已停止。
------------------------------------------------------------
正在停止 Hive metastore...
成功:Hive metastore (PID: 16257) 已停止。
------------------------------------------------------------
------------------------------------------------------------
正在启动 Hive metastore...
成功:Hive metastore 已启动。
日志文件: /opt/module/hive-4.0.0/logs/metastore.log
------------------------------------------------------------
正在启动 Hive hiveserver2...
成功:Hive hiveserver2 已启动。
日志文件: /opt/module/hive-4.0.0/logs/hiveserver2.log
------------------------------------------------------------
在Hive客户端beeline登录hive进行测试:
[root@hadoop101 conf]# beeline -u jdbc:hive2://hadoop101:10000 -n root
#查看默认使用执行引擎
0: jdbc:hive2://hadoop101:10000> set hive.execution.engine;
+----------------------------+
| set |
+----------------------------+
| hive.execution.engine=tez |
+----------------------------+
1 row selected (0.315 seconds)
2. hive ha搭建
在使用Hive过程中,如果Hive服务端hiveserver2 服务挂掉之后,我们就不能使用beeline方式连接Hive。这时我们需要对hiveserver2进行高可用部署,这就是Hive HA 高可用。Hive从0.14开始,使用Zookeeper实现了HiveServer2的HA功能(ZooKeeper Service Discovery),Client端可以通过指定一个nameSpace来连接HiveServer2,而不是指定某一个host和port。
Hive高可用部署我们这里选择hadoop101、hadoop102两台节点为hiveserver2服务节点,也就是hive服务端,hadoop103节点是Hive客户端,具体搭建Hive HA步骤如下:
2.1 在hadoop101节点上配置hive-site.xml
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_ha/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop101:3305/hive_ha?createDatabaseIfNotExist=true&useSSL=false&allowPublicKeyRetrieval=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- 指定HiveServer2 端口 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop101</value>
</property>
<!-- 指定HiveServer2 端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- Hive Server2 HA 配置 -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<value>node3:2181,node4:2181,node5:2181</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
</configuration>
2.2 将hadoop101节点上的hive安装包发送到hadoop102节点
[root@hadoop101 software]# scp -r /opt/module/hive-4.0.0/ hadoop102:`pwd`
2.3 在hadoop102节点上修改hive-site.xml配置文件
将hiveserver2 host绑定的节点修改为hadoop102节点。
... ...
<!-- 指定HiveServer2 端口 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>
... ...
2.4 初始化Hive
在hadoop101节点或者 hadoop102任意一台节点初始化Hive
[root@hadoop101 ~]# schematool -dbType mysql -initSchema
2.5 启动Hive Metastore和HiveServer2服务
在hadoop101、hadoop102节点启动Metastore和HiveServer2服务。
然后再客户端中将"hive.metastore.uris"配置为"thrift://hadoop101:9083,thrift://hadoop102:9083"就能实现metastore服务的高可用。
2.6 在Hive客户端node3节点上通过beeline连接hive
配置Hive Server2 HA 后通过beeline连接Hive格式如下:jdbc:hive2://hadoop集群地址/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=,zookeeper的端口可以省略,默认就是2181。
[root@node3 ~]# beeline -u "jdbc:hive2://hadoop101,hadoop102,hadoop103/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk" -n root
2.7 测试ha
在Hive中建表并插入数据:
#Hive中建表及插入数据
create table person(id int ,name string ,age int) row format delimited fields terminated by '\t';
insert into person values (1,'zs',18),(2,'ls',19),(3,'ww',20);
#查询表中数据
select * from person;
+------------+--------------+-------------+
| person.id | person.name | person.age |
+------------+--------------+-------------+
| 1 | zs | 18 |
| 2 | ls | 19 |
| 3 | ww | 20 |
+------------+--------------+-------------+
可以将连接的hadoop101和hadoop102节点上hiveserver2 服务kill掉其中一个,然后继续通过beeline进行查询,可以正常查询。注意:测试hiveserver2HA ,当一个hiveserver2 挂掉之后,我们需要重新登录beeline 通过jdbc方式连接Hive。
#kill 掉hadoop101节点的hiveserver2进程
[root@hadoop101 software]# kill -9 70736(根据自己的runjar进程kill)
#在hadoop103再次登录beeline 查询hive表中数据
[root@hadoop103 ~]# beeline -u "jdbc:hive2://hadoop101,hadoop102,hadoop103/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk" -n root
select * from person;
+------------+--------------+-------------+
| person.id | person.name | person.age |
+------------+--------------+-------------+
| 1 | zs | 18 |
| 2 | ls | 19 |
| 3 | ww | 20 |
+------------+--------------+-------------+