Hive3 新特性

Hive On Tez

Hive 引擎的支持

Hive作为数据仓库工具,底层的计算由分布式计算框架实现,目前Hive支持三种计算引擎,分别是MapReduce、Tez、Spark。Hive中默认的计算引擎是MapReduce,由hive.execution.engine参数属性控制。

Hive从2.x版本开始就提示未来的版本中将不再支持底层使用MapReduce,推荐使用Tez或者Spark引擎来代替MapReduce计算。如果依旧要使用MapReduce,需要使用Hive的1.x版本。

1
WARN  : Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.

Tez的介绍

Hive底层默认的的计算引擎为MapReduce,由于MapReduce的编程模型不够灵活,性能相对较差等问题,在实际使用Hive的过程中,我们建议将Hive的底层计算引擎更改为Tez或者Spark引擎。

Tez是Apache社区中的一种支持DAG作业的开源计算框架,它可以将多个有依赖的作业转换为一个作业从而大幅提升DAG作业的性能。核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。最终Tez也会将程序提交给YARN来实现运行。

Tez并不直接面向最终用户,事实上它允许开发者为最终用户构建性能更快、扩展性更好的应用程序。Tez项目的目标是支持高度定制化,这样它就能够满足各种用例的需要,让人们不必借助其他的外部方式就能完成自己的工作,如果 Hive这样的项目使用Tez来代替MapReduce作为其数据处理的工具,那么将会显著提升它们的响应时间。

特点

  • 灵活的数据流定义
  • 灵活的输入、输出、运行时模型
  • 与数据类型无关
  • 部署方便简洁
  • 高性能执行:
  • 最佳资源管理
  • 计划配置动态更新
  • 动态物理数据流决策

官网:http://tez.apache.org/

image-20211114234604969

Apache Tez未来将替换MapReduce做为默认的Hive执行引擎。Hive3未来的版本将不再支持MapReduce。Tez通过有向无环图(DAG)和数据传输原语的表达式,在Tez下执行Hive查询可以提高性能。整体的执行过程如下图所示:

image-20211114234648637

Hive编译查询。

Tez执行查询。

YARN为群集中的应用程序分配资源,并为YARN队列中的Hive作业启用授权。

Hive根据表类型更新HDFS或Hive仓库中的数据。

Hive通过JDBC连接返回查询结果。

Tez的编译

目前Apache官方http://archive.apache.org/dist/tez/最新版本为0.9系列版本,0.9系列版本为针对Hadoop2.x系列的版本,使用的Hadoop为3.x版本,所以可以使用GitHub中已发布的0.10版本的tez。

编译

0.10不是正式版本,针对Hadoop3需要单独手动编译,可以使用我们提前编译好的安装包,也可以参考以下过程进行编译。

下载依赖

1
yum -y install autoconf automake libtool cmake ncurses-devel openssldevel lzo-devel zlib-devel gcc gcc-c++

安装Maven

解压

1
tar zxvf apache-maven-3.5.4-bin.tar.gz –C /export/server

配置环境变量:vim /etc/profile

1
2
3
export MAVEN_HOME=/export/server/apache-maven-3.5.4
export MAVEN_OPTS="-Xms4096m -Xmx4096m"
export PATH=:$MAVEN_HOME/bin:$PATH

修改Maven仓库:vim /export/server/apache-maven-3.5.4/conf/settings.xml

1
2
3
4
5
6
7
8
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

验证

1
mvn -v

image-20211114235005177

安装ProtocolBuffer

解压

1
tar zxvf protobuf-2.5.0.tar.gz –C /export/server

编译安装

1
cd /export/server/protobuf-2.5.0  ./configure  make && make install

验证

1
protoc --version

解压tez-master.zip

1
unzip tez-master.zip -d /export/server

修改pom.xml

修改Hadoop和slf4j的版本

1
2
<hadoop.version>3.1.4</hadoop.version>  
<slf4j.version>1.7.25</slf4j.version>

注释tez-ui模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<modules>
<module>hadoop-shim</module>
<module>tez-api</module>
<module>tez-build-tools</module>
<module>tez-common</module>
<module>tez-runtime-library</module>
<module>tez-runtime-internals</module>
<module>tez-mapreduce</module>
<module>tez-examples</module>
<module>tez-tests</module>
<module>tez-dag</module>
<module>tez-ext-service-tests</module>
<!-- <module>tez-ui</module> -->
<module>tez-plugins</module>
<module>tez-tools</module>
<module>hadoop-shim-impls</module>
<module>tez-dist</module>
<module>docs</module>
</modules>

指定Maven仓库地址

1
2
3
4
5
6
7
8
9
10
11
12
<repositories>
<repository>
<id>central</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</pluginRepository>
</pluginRepositories>

编译

1
2
cd /export/server/tez-master
mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -Phadoop28 -P\!hadoop27

image-20211114235324314

提取安装包

1
ll tez-dist/target/

tez-0.10.1-SNAPSHOT-minimal.tar.gz:程序安装包

tez-0.10.1-SNAPSHOT.tar.gz:程序依赖包

Tez的部署

安装

上传编译好的安装包到HiveServer所在的机器的/export/software目录下

tez-0.10.1-SNAPSHOT-minimal.tar.gz:Tez程序安装包

tez-0.10.1-SNAPSHOT.tar.gz:依赖包

解压程序安装包:

1
mkdir /export/server/tez  cd /export/software/  tar -zxvf tez-0.10.1-SNAPSHOT-minimal.tar.gz -C /export/server/tez

上传依赖包到HDFS上

1
2
hdfs  dfs –mkdir –p /tez
hdfs dfs -put /export/software/tez-0.10.1-SNAPSHOT.tar.gz /tez

配置Hadoop关联Tez

创建tez-site.xml

1
2
cd /export/server/hadoop-3.1.4/etc/hadoop
vim tez-site.xml

添加以下内容配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/tez/tez-0.10.1-SNAPSHOT.tar.gz</value>
</property>
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>true</value>
</property>
<property>
<name>tez.am.resource.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>tez.am.resource.cpu.vcores</name>
<value>1</value>
</property>
<property>
<name>tez.container.max.java.heap.fraction</name>
<value>0.4</value>
</property>
<property>
<name>tez.task.resource.memory.mb</name>
<value>1024</value>
</property>
<property>
<name>tez.task.resource.cpu.vcores</name>
<value>1</value>
</property>
</configuration>

将tez-site.xml分发给其他Hadoop节点

1
2
3
cd /export/server/hadoop-3.1.4/etc/hadoop
scp tez-site.xml node2:$PWD
scp tez-site.xml node3:$PWD

配置环境变量

修改配置文件

1
2
cd /export/server/hadoop-3.1.4/etc/hadoop/shellprofile.d
vim example.sh

文件末尾添加以下内容

1
2
3
4
5
6
7
hadoop_add_profile tez
function _tez_hadoop_classpath
{
hadoop_add_classpath "$HADOOP_HOME/etc/hadoop" after
hadoop_add_classpath "/export/server/tez/*" after
hadoop_add_classpath "/export/server/tez/lib/*" after
}

配置Hive关联Tez

修改hive-site.xml,添加以下配置

1
vim $HIVE_HOME/conf/hive-site.xml

修改hive-env.sh,添加以下配置

1
2
3
4
5
6
7
8
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
<property>
<name>hive.tez.container.size</name>
<value>1024</value>
</property>

删除Tez中冲突的依赖包

1
rm -rf /export/server/tez/lib/slf4j-log4j12-1.7.25.jar

Hadoop的core-site.xml中配置LZO压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
1
2
3
cd /export/server/hadoop-3.1.4/etc/hadoop/
scp -r core-site.xml node2:$PWD
scp -r core-site.xml node3:$PWD

配置Hive的环境变量:vim /export/server/hive-3.1.2-bin/conf/hive-env.sh

1
2
3
4
5
6
7
8
9
export TEZ_HOME=/export/server/tez
export TEZ_JARS=""
for jar in `ls $TEZ_HOME |grep jar`; do
export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`; do
export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/lib/$jar
done
export HIVE_AUX_JARS_PATH=/export/server/hadoop-3.1.4/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar$TEZ_JARS

重启Hadoop

1
2
3
4
stop-dfs.sh
stop-yarn.sh
start-dfs.sh
start-yarn.sh

启动Hive

1
2
3
/export/server/hive-3.1.2-bin/bin/hive --service metastore
/export/server/hive-3.1.2-bin/bin/hive --service hiveserver2
/export/server/hive-3.1.2-bin/bin/hive

Tez的使用

设置引擎为mr,测试

1
2
3
set hive.execution.engine = mr;
use db_function;
select deptno,count(*) as numb from tb_emp group by deptno order by numb desc ;

设置引擎为tez,测试

1
2
3
4
#如果想一直使用tez执行 可以把上述参数添加在hive-site.xml中
set hive.execution.engine=tez;
set hive.tez.container.size=1024;
select deptno,count(*) as numb from tb_emp group by deptno order by numb desc ;

设置引擎为tez,beeline测试

1
2
3
4
5
/export/server/hive-3.1.2-bin/bin/beeline -u jdbc:hive2://node1:10000 -n root -p 123456
set hive.execution.engine=tez;
set hive.tez.container.size=1024;
use db_function;
select deptno,count(*) as numb from tb_emp group by deptno order by numb desc ;

LLAP 的更新

LLAP是hive 2.0版本就引入的特性,在Hive 3中与Tez集成的应用非常成熟。Hive官方称之为实时长期处理(Live long and process),实现将数据预取、缓存到基于yarn运行的守护进程中,降低和减少系统IO和与HDFS DataNode的交互,以提高程序的性能,LLAP 目前只支持tez引擎

LLAP提供了一种混合执行模型。它由一个长期存在的守护进程(该守护进程替换了与 HDFS DataNode 的直接交互)以及一个紧密集成的基于 DAG 的框架组成。诸如缓存,预取,某些查询处理和访问控制之类的功能已移至守护程序中。此守护程序直接直接处理小/短查询,而任何繁重的工作都将在标准 YARN 容器中执行。

与 DataNode 相似,LLAP 守护程序也可以由其他应用程序使用。该守护进程还通过可选的 API(例如 InputFormat)打开,其他数据处理框架可将其用作构建块。下图显示了使用 LLAP 的示例执行。 Tez AM 统筹整体执行,查询的初始阶段被推送到 LLAP 中,在还原阶段,将在单独的容器中执行大型Shuffle,多个查询和应用程序可以同时访问 LLAP。

image-20211115000131677

LLAP 在现有的Hive基于流程的执行中工作,以保持Hive的可伸缩性和多功能性。它不会替代现有的执行模型,而是对其进行了增强。它有如下的几个特点:

LLAP守护程序是可选的。Hive 可以在没有它们的情况下工作,并且即使已经部署并启动运行LLAP也可以绕过不执行。

外部编排和执行引擎。LLAP 不是执行引擎,不同于MapReduce 或 Tez。整个执行由现有的 Hive 执行引擎(例如 Tez)在 LLAP 节点以及常规容器上透明地调度和监控。显然,LLAP 的支持级别取决于单独的执行引擎。不计划支持 MapReduce,但以后可能会添加其他引擎,例如Pig 等其他框架也可以选择使用 LLAP 守护程序。

部分执行。LLAP 守护程序执行的工作结果可以构成 Hive 查询结果的一部分,也可以根据查询传递给外部 Hive 任务。

资源 Management。 YARN 仍然负责资源的 Management 和分配。 YARN 容器委派模型允许将分配的资源传输到 LLAP。为了避免 JVM 内存设置的限制,高速缓存的数据以及用于处理的大缓冲区(例如,分组依据,联接)将保持堆外状态。这样,守护程序可以使用少量内存,并且将根据工作负载分配其他资源(即 CPU 和内存)。

Hive3增强了在多租户场景下的LLAP负载管理,主要通过resource plan的方式进行实现:

  • 划分LLAP资源为多个pool,比如bi池和etl池
  • 自动映射applications到对应的池
  • 可以设置触发条件,实现自动从一个池到另一个池,比如自动把长时间运行的application移动到etl池
  • 可以根据需要activate/deactivate这些resource pools

Metastore独立模式

Metastore的功能

Hive中的所有对象,如数据库、表、函数等,所有对象的定义都存储在Metastore中。根据系统的配置方式,数据的统计信息和权限的授权记录也可能存储在metastore中。Hive或者其他执行引擎在运行时会使用这些元数据来决定如何解析、授权和有效地执行用户查询。

元数据存储可以将对象的定义持久化到关系数据库(RDBMS)中,也可以将元数据存储配置为嵌入式的Apache Derby RDBMS或连接到外部RDBMS。Metastore本身可以完全嵌入到用户进程中,也可以作为服务运行,供其他进程连接。

Metastore独立模式

从Hive 3.0开始,Metastore可以在不安装Hive其他部分的情况下单独运行,它将作为一个单独的发行版提供,用于实现允许其他非Hive的系统,例如Spark、Impala等轻松地与Metastore集成。目前,为了方便起见,依旧建议将Metastore放在Hive中。

要使Metastore成为一个独立的服务,需要修改大量的参数,目前Hive官方为了最大限度地向后兼容,所有旧的配置参数仍然有效。Hive的Metastore服务将读取metastore-site.xml,同时也会从Hive的配置文件目录中读取hive-site.xml或者hive-memstoresite.xml文件。不论Hive使用哪种方式实现元数据存储,外部的RDBMS或者内嵌的Derby数据库,都会使用以下参数来单独配置MetaStore服务:

Hive3参数 Hive2参数 默认值 参数含义
metastore.thrift.uris hive.metastore.uris none Metastore服务进程的地址
metastore.thrift.port hive.metastore.port 9083 Metastore服务进程的端口
metastore.warehouse.dir hive.metastore.warehouse.dir none 默认元数据存储的URI
datanucleus.schema.autoCreateAll datanucleus.schema.autoCreateAll false 是否允许自动构建schema,不建议开启,建议使用schematool替代,如果开启,需要配置hive. metaore.schema.verification=false
metastore.schema.verification hive.metastore.schema.verification true 强制metastore的schema一致性,开启的话会校验在metastore中存储的信息的版本和hive的jar包中的版本一致性,并且关闭自动schema迁移,用户必须手动的升级hive并且迁移schema,关闭的话只会在版本不一致时给出警告。
metastore.hmshandler.retry.attempts hive.hmshandler.retry.attempts 10 当metastore连接出错时,重试的次数.
metastore.hmshandler.retry.interval hive.hmshandler.retry.interval 2 sec 重试的时间间隔
metastore.log4j.file hive.log4j.file none Log4j 日志配置文件,如果没有设置将从$METASTORE_HOME/conf 找到metastore-log4j2.properties配置文件
metastore.stats.autogather hive.stats.autogather true 是否在插入命令时自动收集基本统计信息

配置好以上参数后,可以使用start-metastore.sh来启动metastore服务。

从Hive 3.0开始,Metastore作为一个单独的包发布,可以在没有Hive其他部分的情况下运行。这称为独立模式。但是在默认情况下Metastore配置为与Hive一起使用,因此在这个配置中需要修改一些配置参数。

metastore.task.threads.always org.apache.hadoop.hive.metastore.events.eventcleanertask,org.apache.hadoop.hive.metastore.MaterializationsCacheCleanerTask
metastore.expression.proxy org.apache.hadoop.hive.metastore.defaultpartitionexpressionproxy

目前,如果使用独立模式,以下特性还没有经过测试,或者已经明确不能在独立模式下与Metastore一起使用

如果没有Hive,ACID表中的Compactor将无法运行,可以对ACID表进行读写,但不能compact

Replication也没有在独立模式中实现测试

独立模式部署测试

安装

将下载好的hive-standalone-metastore-3.0.0-bin.tar上传到/export/software目录下

解压

1
tar -zxvf hive-standalone-metastore-3.0.0-bin.tar.gz -C /export/server/

配置

修改配置文件

1
vim /export/server/apache-hive-metastore-3.0.0-bin/conf/metastore-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<configuration>
<property>
<name>metastore.thrift.uris</name>
<value>thrift://node1:9083</value>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>
<property>
<name>metastore.task.threads.always</name>
<value>org.apache.hadoop.hive.metastore.events.EventCleanerTask</value>
</property>
<property>
<name>metastore.expression.proxy</name>
<value>org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy</value>
</property>
</configuration>

复制hive-site.xml到conf目录下

1
2
cd /export/server/apache-hive-metastore-3.0.0-bin/
cp /export/server/hive-3.1.2-bin/conf/hive-site.xml ./conf/

删除旧版本的guava,复制hive中的guava到lib目录中

1
2
rm -rf lib/guava-19.0.jar
cp /export/server/hive-3.1.2-bin/lib/guava-27.0-jre.jar ./lib/

复制MySQL的连接驱动包到lib目录下

1
cp /export/server/hive-3.1.2-bin/lib/mysql-connector-java-8.0.19.jar ./lib/

独立启动metastore

1
2
cd /export/server/apache-hive-metastore-3.0.0-bin/
bin/start-metastore

启动hiveserver2

1
2
cd /export/server/hive-3.1.2-bin/
bin/hive --service hiveserver2

启动beeline

1
2
cd /export/server/hive-3.1.2-bin/
bin/beeline -u jdbc:hive2://node1:10000 -n root -p 123456

Hive3 新特性
https://flepeng.github.io/045-Hive-Hive3-新特性/
作者
Lepeng
发布于
2025年1月1日
许可协议