大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建一

说明:本篇开始主要是对前面的Hadoop2.x大数据组件搭建博文做Hadoop3.x集群搭建方法的升级,不过只会设计到将Hadoop升级为3.x后,搭建方式受影响的组件,其他的如果没发生变动则不会再写一遍,只会标明安装的版本,毕竟没有必要,不过如果搭建中发现前面2.x其他组件受到了影响,且本篇开始没有提供搭建升级,则给博主留言,因为本人也要上班,大厂牛马加班太多。反正总体上来讲较新的版本和老版本只是在搭建要求上有些地方不一样,使用上差别不大。本篇用于搭建的3.x集群为了防止影响,使用了一套新的环境,节点任然是三台,大家如果是从原来的2.x升级,则对照着节点安装就行

192.168.239.181 node001
192.168.239.182 node002
192.168.239.183 node003

本篇安装软件版本

JAVAJDK1.8 这里不再演示,直接准备就行
scala-jdk 2.13.6
zookeeper3.8.4
hadoop3.2.3
hive3.1.3
tez 0.10.1 如果你有2025年之前编译好的tar包,就还能正常安装上用一用,否则现在源码包编译有一些关键组件已经无法通过编译得到完整的包了,就连官方直接下载得到的bin-tar里面也缺东西


scala

官网下载-》https://scala-lang.org/ ,和Java-JDK一样的安装方法,这里不再展示

zookeeper

安装步骤见–》https://blog.csdn.net/dudadudadd/article/details/109679296

hadoop

安装步骤见 -》https://blog.csdn.net/dudadudadd/article/details/139547748

Hive

第一步:去官网下载Hive的安装包,直接搜索apache hive就行,下载好之后上传服务器解压,并配置环境变量

export HIVE_HOME=/opt/hive-3.1.3
export PATH=$PATH:${HIVE_HOME}/bin

第二步:进入hive的conf目录下编辑配置文件,新建hive-site.xml文件并追加如下内容,注意这里直接用mysql了,就不介绍默认的元数据库类型了,3.x的hive保险起见用mysql5,当然如果条件不允许就用8.x也行

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- jdbc 链接地址mysql 特别注意要改成自己的mysql所在地址,还有库名也可以自定义,注意mysql里面的元数据库一定不要盲目的手动去建立,不然使用的时候会出问题的,你要想自己先建好,那么要运行alter database hive character set latin1; 把字符集改了-->
	<property>
	  <name>javax.jdo.option.ConnectionURL</name>
	  <value>jdbc:mysql://192.168.1.103:3306/metastore?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
	  <description>JDBC connect string for a JDBC metastore</description>
	</property>

	<property>
	  <name>javax.jdo.option.ConnectionDriverName</name>
	  <value>com.mysql.jdbc.Driver</value>
	  <description>Driver class name for a JDBC metastore</description>
	</property>

	<property>
	  <name>javax.jdo.option.ConnectionUserName</name>
	  <value>root</value>
	  <description>username to use against metastore database</description>
	</property>
	
	<!-- mysql口令也要改写成自己的口令-->
	<property>
	  <name>javax.jdo.option.ConnectionPassword</name>
	  <value>root</value>
	  <description>password to use against metastore database</description>
	</property>
	
	<!-- hive的warehouse保存目录,就是hive保存数据的目录-->
    <property>
		<name>hive.metastore.warehouse.dir</name>
		<value>/user/hive/warehouse</value>
		<description>location of default database for the warehouse</description>
    </property>
	
	<!-- hive的cli链接使用时对查询语句是否展示列名,默认true-->
	<property>
		<name>hive.cli.print.header</name>
		<value>true</value>
	</property>

    <!-- hive的cli链接使用时是否展示所在库,默认true-->
	<property>
		<name>hive.cli.print.current.db</name>
		<value>true</value>
	</property>

    <!-- 让hive在插入数据时压缩-->
	<property>
		<name>hive.exec.compress.output</name>
		<value>false</value>
	</property>
	
	<!-- 元数据服务所在的url,如果你要配置高可用那就用逗号分隔写多个 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://node001:9083</value>
    </property>

	<!-- 启用hiveserver2 -->
	<property>
		<name>hive.server2.enable</name>
		<value>true</value>
	</property>

	<!-- binary模式下hiveserver2响应连接的端口,默认10000 -->
	<property>
		<name>hive.server2.thrift.port</name>
		<value>10000</value>
	</property>

	<!-- hiveserver2响应范围控制 ,这个你可以在不同节点配置,也可以保持4个0,用来启动多个hs2高可用 一般是4个0这样启动比较灵活-->
	<property>
		<name>hive.server2.thrift.bind.host</name>
		<value>0.0.0.0</value>
	</property>

	<!-- hiveserver2默认响应的方式是binary,二进制模式能够提供更好的性能和效率,但它可以用http服务,两个模式供你选择 -->
	<property>
		<name>hive.server2.transport.mode</name>
		<value>binary或者http</value>
	</property>
	
	<!-- 如果你选择以http形式提供hiveserver2,那么就要用这个配置来修改它的端口-->
	<property>
		<name>hive.server2.thrift.http.port</name>
		<value>10002</value>
	</property>

    <!-- 生成环境要把下面两个统计任务信息的非阻塞功能关掉
     因为虽然它会利用收集到的信息优化后续job,单它在运行时会造成额外的job,对资源造成浪费
     并且生成环境的任务通常由开发人员直接调整任务参数,无需它来收集
     最重要的是,它会造成hivemeta的短暂不可用,从而导致TTransportException错误异常
     并且当你的任务经过参数调整或者语句本身复杂程度影响和该能力收集信息不匹配时,会导致任务发生StatsTask报错,虽然不影响任务本身,但是很膈应人
     当你使用hive -e或者-f执行sql后会影响反馈的状态码
     -->
    <!-- 是否自动统计任务涉及的表信息,来优化后续job -->
    <property>
        <name>hive.stats.autogather</name>
        <value>false</value>
    </property>
    <!-- 是否自动统计任务涉及的列信息,来优化后续job -->
    <property>
        <name>hive.stats.column.autogather</name>
        <value>false</value>
    </property>
</configuration>

如果你要使用高可用,你还要配置zk集群的链接,配置在这里-》 Hive高可用配置

第三步:把hive-env.sh.template文件末尾的.template去掉,让文件启用,且找到并修改如下配置

# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/opt/hadoop-3.2.3

# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/hive-3.1.3/conf

释放hive-log4j2.properties.template文件,修改里面的property.hive.log.dir配置指定日志路径

第四步:在hive3.1.3和hadoop3.2.3整合的时候,会出现一个jar版本冲突,你要进入hive的lib目录下删掉guava-19.0.jar包,然后把hadoop的lib中27版本的guava包复制到hive里面

rm -rf /opt/hive-3.1.3/lib/guava-19.0.jar
cp /opt/hadoop-3.2.3/share/hadoop/common/lib/guava-27.0-jre.jar /opt/hive-3.1.3/lib/

第五步:把你的mysql数据库jdbc驱动放到hive的lib目录下,运行元数据初始化脚本,注意!如果你要让hive元数据mysql库使用utf8字符集,则数据库版本最低要5.5.3以后的,一般用的都是5.7

实际使用中要先建hive的mysql用户和库

CREATE USER 'hive'@'%' IDENTIFIED BY '123456';
#hive数据库的字符集不要上来直接改默认为utf8,后续按需改字段
CREATE DATABASE hivemeta DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci;
GRANT ALL PRIVILEGES ON hivemeta.* TO 'hive'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

运行hive的bin下初始化数据库脚本

./bin/schematool -dbType mysql -initSchema

当你看到如下提示意味着元数据库初始化成功

Initialization script completed
schemaTool completed

第六步:hive3.1.3和hadoop3.2.3整合的时候,必须在hadoop的core-site.xml里面添加如下的代理用户配置,具体用法见https://blog.csdn.net/dudadudadd/article/details/148031272,因为hadoop3.x对安全相关做了更细致的限制,不配置的话服务启动不了

<property>
	<name>hadoop.proxyuser.root.hosts</name>
	<value>*</value>
</property>
<property>
	<name>hadoop.proxyuser.root.groups</name>
	<value>*</value>
</property>

第七步:这一步如果你的元数据储存储用的是mysql,且版本是8.x就要做,将mysql服务的安全模式和严格解除,他们会阻止一些sql批量操作

进入mysql后执行如下命令

SET SQL_SAFE_UPDATES = 0;
SET SESSION sql_mode = '';

FLUSH PRIVILEGES;

随后更改 /etc/my.cnf ,追加或更改如下配置,用来永久关闭安全模式,注意位置!!!区分mysqld 和 mysql

[mysqld]
#设置非严格模式
sql_mode=NO_ENGINE_SUBSTITUTION


[mysql]
#安全模式 0 为关闭
sql_safe_updates = 0

第八步:运行命令进入hive,测试一下是否可以操作

/opt/hive-3.1.3/bin/hive --service metastore &
/opt/hive-3.1.3/bin/hive

并且测试hiveserver2能否正常使用

/opt/hive-3.1.3/bin/hiveserver2 &
/opt/hive-3.1.3/bin/beeline -u jdbc:hive2://node001:10000

或者查看hiveserver2的端口是否有了监听

[root@node1 ~]# netstat -nltp|grep 10000
tcp6       0      0 :::10000                :::*                    LISTEN      3258/java  

第九步:把元数据mysql库中,后续使用需要中文的字段字符集改成utf8,尽量别用utf8mb4

先查看一下当前的字符集和排序规则

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

运行如下语句,下面是改了高频使用的,后面使用中如果存在其他字符集,hive一般会给提示,自己改一下就行,改的时候提前看一下原来的字段长度,和实际使用综合考虑

#如果你自己本地使用可以按需改整个库的,不过一般不用变
#alter database hive character set utf8;
ALTER TABLE DBS modify column `DESC` varchar(4000) character set utf8;
ALTER TABLE DBS modify column DB_LOCATION_URI varchar(4000) character set utf8;
ALTER TABLE DBS modify column `NAME` varchar(128) character set utf8;
ALTER TABLE TBLS modify column TBL_NAME varchar(256) character set utf8;
ALTER TABLE TBLS modify column `OWNER` varchar(767) character set utf8;
alter table COLUMNS_V2 modify column `COMMENT` varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE mediumtext character set utf8;
ALTER TABLE PARTITION_KEYS modify column PKEY_NAME varchar(128) character set utf8;
ALTER TABLE PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;

#下面这两个是测试看看什么效果用了一下,做个备忘而已,可以忽略,而且需要用的是8.x的mysql数据库,不然会报索引超长的错误,即使hive3.x优化了元数据索引
#ALTER TABLE PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
#alter table PART_COL_STATS modify column PARTITION_NAME varchar(767) character set utf8

FLUSH PRIVILEGES;

至于上面SHOW查询字符集的结果,如果需要更改要去改mysql的配置文件,这相当于全局在更改,一般不需要改

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[client]
default-character-set=utf8

Tez

特别说明:下面的Tez搭建内容书写时间在2024年年底,当时操作 sao 一点,还可以使用,但在之后的时间中,先是tez官网的安装指导内容出现问题,随后0.10.*的代码编译和直接下载到的结果包都不完整了,所以如果你有2025年之前编译好的包,则按照下面的内容安装,并合理跳过编译相关的内容就行。至于hadoop2.x和tez0.9.*这两个系列版本我本地试了一下不受影响,本身也不需要编译,官网上的结果包也还是完整的

Tez现在已经慢慢的退出一线使用了,在未来市场全面切换到Hadoop3体系之后,Tez可能就不在出现了也说不定,原因不只是它只能稳定运行在Hadoop2+Hive1-2体系下,到了Hadoop3,它也就不能正常运行了,还有一个关键原因是Spark3.x之后,生态环境更加健壮,不止有2019年开始推出的RSS架构,还有3.2版本开始适配的向量化引擎,可以说在速度上,已经不需要hive+Tez的这种组合了,而且像阿里云他们的运维力量较庞大,所以直接已Hive on Spark的架构提供服务。其他厂商也是主Spark,Hive偏向于数据开发元数据存储工具,以及非常计算量庞大,需要一个特稳定的引擎才上Hive on MR 这种方式提供服务

如果你和我同版本,hadoop3.2.3、hive3.1.3,可以下载我之前编译好的————》:https://pan.baidu.com/s/1tLSC9_hpxBQNcM-HOUuZYA?pwd=x1o9

-------手动的分割线,下面内容书写时间为2024年年底

大家不要着急搭建tez,2.x技术体系下hive on tez是一个不错的选择,但是从最开始的hive和tez就不是百分百契合的,截止到2.x体系下,hive on tez的使用甚至需要关闭yarn的资源检查或者显示的配置默认的资源使用大小,而在3.x体系下,虽然很多东西逐渐的完善,比如这里提到的资源检查问题,3.x体系下需要你在tez-site文件中直接写好上限即可。

但是也更加对你个人的技术底蕴是个挑战,比如说3.x体系开始,tez本身就无法完全正常的和hive兼容,如果非要用,倒是也行,但你要满足几点要求,首先必须从手动编译源码修改与之完全匹配的hadoop版本分支开始,编译的时候需要翻墙,有的资源翻墙会因为网速等其他原因导致拿不到。再比如在3.x体系下配置的容错度很低,配置的只有没有大问题,都不影响任务运行,但是3.x体系下就会由于资源冲突而报没有类资源的错误,这一点下面配置的时候会提到。最后是hadoop3下用hive on tez ,将无法使用高可用链接访问hive,会在任务的reduce阶段掉guava包。

所以如果你的源码查看、处理问题等能力不行,就去选择其他的更加保守的技术架构,比如hive on spark,工作中,我用过最好用的是阿里的EMR技术架构,如下图

原文地址-》EMR升级文档

在这里插入图片描述
但是on spark使用成本很高的,hive on spark的话,让hive作为主动方,会发生很多耦合问题,最让人头疼的就是两者的类冲突,其次都有spark了,干嘛要套一层hive呢,很多公司不愿意付出这个成本,说白了就是成本和用户体验的博弈,而spark做主动方,读hive数据就就很解耦了,除非你在读hive数据在外,直接调用了hive的资源,比如udf等,不然一般不会发生耦合等让人头疼的问题,甚至spark自身的源码耦合都相当低,低的令人发指,比如操作hive的orc数据和text数据走的类库都不一样,在源码里面,orc数据走的是InsertHive…类,而text数据走的是InsertHadoop…,但是你要是直接向hive-orcg格式表路径下直接写orc文件,那么走的又是InsertIntoHadoopFsRelationCommand类,前面两个类名有点长记不清了,但不重要,只是想告诉大家,hive现在更多的就是个管元数据的,跑数据有一级响应的即席查询presto和二级响应批处理spark基本够了,并且sparksql的语法自身和hive重合率很高的,在操作hive数据上也可以create function的方式定义udf函数等操作,而不是只用spark-core的形式,不过要是你待的公司愿意付出这个成本那就不说啥了

下面言归正传,开始搭建tez

1、官网下载tez0.10.1源码包和结果包,https://tez.apache.org/releases/index.html,源码是带src的那个,同时再次强调一遍对于Tez版本0.8.3及更高版本,Tez需要Apache Hadoop版本为2.6.0或更高版本。Tez版本0.9.0及更高版本,Tez需要Apache Hadoop版本为2.7.0或更高版本,对于Hadoop3.x以后的版本需要自己编译,以匹配准确对应的hadoop版本分支。

2、在linux中,上传包的方式安装maven3,修改maven的仓库为官方仓,不要用阿里等国内镜像,有的包拉不下来,所以说你需要一个翻墙的手段,你看其他文献会让你再安装一个nodejs,但其实不需要另外安装nodejs,Tez的源码里面有自带的,而且还是一个5.x的低版本,虽然可以用软连接的方式替换,但是nodejs在10.x版本有一次调整,导致字符串缓冲区的处理方式不同,所以10.x前后的版本一般不混用,虽然apache顶设下不物理删除旧的SDK,但是保不住其他架构有没有适配。

  <mirror>
        <id>maven-public</id>
        <mirrorOf>*</mirrorOf>
        <name>maven公共仓库</name>
        <url>https://repo.maven.apache.org/maven2/</url>
  </mirror>

在后面的编译中,maven会拉取很多包,如果遇到拉取jar的问题,可以尝试为maven手动装载包,比如frontend-plugin-core包和frontend-maven-plugin包,就用下面这个命令

mvn install:install-file -Dfile=/opt/frontend-plugin-core-1.15.1.jar -DgroupId=com.github.eirslett -DartifactId=frontend-plugin-core -Dversion=1.15.1 -Dpackaging=jar

3、在http://rpm.pbone.net/或者阿里源https://developer.aliyun.com/mirror/里搜索下载 protobuf-2.5.0protobuf-compiler-2.5.0的安装包,随后用rpm安装就行。
你也可以yum方式装protoc包,但注意你的yum中可能没有这个包或者2.5.0的版本了
注意你的搜索结果或许会有多个,你要找到符合你环境的那个包,比如/vol/rzm7/linux-centos-vault/7.5.1804/os/x86_64/Packages/protobuf-2.5.0-8.el7.i686.rpm/vol/rzm7/是资源来自于那个站点,linux-centos-vault是系统,系统后面的vault 值的是这个站点资源存放着很多往期资源,优先使用没有vault的站点资源,7.5.1804是系统版本号,通常大版本一致就行,比如7.5这个大版本下的包一般是都可以用的,os是资源仓库名,就和yum的base仓库等一个意思,x86_64是系统的架构信息,最后的Packages/protobuf-2.5.0-8.el7.i686.rpm前面的路径一般不重要,最后一部分是包名

5、运行yum install -y git安装git,如果当前你的yum源中没有,用下面的源即可

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all  #清除所有
yum makecache #重新建立源数据

如果你需要tar包,可以到国内镜像:https://mirrors.edge.kernel.org/pub/software/scm/git/ 中找

5、下面解压并进入tez源码包,改父项目下的pom文件,hadoop改成你的版本,比如我用的是323的

<hadoop.version>3.2.3</hadoop.version>

确定一下guava包的版本,与hive一样,一定要和hadoop保持同版本也就是guava-27

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.0-jre</version>
</dependency>

把slf4j相关的两个依赖范围改成provided,因为编译完这个包会和hadoop的冲突,所以为了保险起见我的习惯是把它注释掉,hive的lib下也有这两个包,不过从使用上来看hive的包不会由于冲突导致致命性错误,所以可以不动

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
	<scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
	<scope>provided</scope>
</dependency>

5、在父项目主路径下编译tez,如果你要带着bower 环境就不要用root用户,有的资源掉用的时候不让用root执行

mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true

这一步需要你启动翻墙手段,但是!!!99%的可能会死在bower install阶段,这是由于网络延迟或者git目的仓库对应的版本有问题,如果你用的版本发生了这种情况,告诉你一个妖点子:在tez主项目的pom文件中,把tez-ui的模块声明删掉,整个nodejs相关都是为编译这个模块准备的。删掉之后正常编译,而tez-ui模块中除了DAG主类,剩下的资源都不影响其他的东西,也就是说,你只需要把官网得到的同版本tez成品tar解压开,把里面tez-ui的war包,以及对比下图中没有的文件一起放在你的tar包里面就可以了,lib下面的包不需要处理,只关注HOME目录下的就行,还有前面说到的两个slf包,如果编译pom里头没有改,就进lib目录里面删掉它们,最后把Tez的home目录下所有文件以没有子路径的方式压缩成为一个新的tar包,在下一步上传tar包到hdfs上的时候就上传这个新的压缩包,没有子路径的意思是,解压之后就是所有文件,而不是还有一层目录
在这里插入图片描述

6、编译需要一点时间,当编译完成后结果物在主项目下面的tez-dist/target/路径中,随后将包含minimal后缀的tez-tar包上传到hdfs的一个路径下,至于是否解压都可以,只影响后面配置资源路径的方式不同而已,例如如下路径。

Hadoop fs -mkdir /apps/tez-x.y.z
hadoop fs -copyFromLocal tez-dist/target/tez-x.y.z-minimal.tar.gz /apps/tez-x.y.z

我个人习惯上传解压后的包,如果上传一个压缩包,一来是必须在tez-site.xml里面额外的明确指定类路径,二来hive本来就不快,再解压一个170M的tez包有点不值当

随后将tez-x.y.z-minimal.tar.gz包解压到hive同服务器的一个路径下,后面配置完成后可以选择是否同步所有hadoop节点,给未来hadoop需要加载这些资源时兜底,后面会提到

这里注意一坑点,无论是网上其他文献,还是按照官网安装说明的开头部分,你都会看到上传的是没有minimal后缀的tez-tar包,但是!!官网的原文最下方说到,tez有两种安装模式,无论是那种,都用的是有minimal后缀的tez-tar包,下面是官网的原文,搭建的时候注意一下即可,至于hadoop的依赖问题,按照官网的说法模式A用的是集群上在用的hadoop资源,模式B是上传了一个额外的hadoop版本包
在这里插入图片描述
在这里插入图片描述

7、新建并配置tez-site.xml文件,这个文件的位置,需要注意一下,如果你在下面要配置hadoop加载,即使你不用yarn-tez,那么放在哪里都行,如果你只给hive用,那么就需要放在hive的conf下面,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- Tez需要本地和hdfs都有一份资源包,这里就用来指定hdfs上的资源地址,模式B搭建时,这里还要指定hadoop的资源包 -->
    <!-- 注意我前面说了,我上传的是一个解压后的包,如果你上传了一个压缩包,这里要写成${fs.defaultFS}/tez/tez-0.10.1-minimal.tar.gz#tez,还要指定类路径,详情见官网 -->
    <property>
        <name>tez.lib.uris</name>
        <value>${fs.defaultFS}/tez/tez-0.10.1,${fs.defaultFS}/tez/tez-0.10.1/lib</value>
    </property>

    <!-- 如果你用的是压缩包就需要用这个配置指定资源类路径,路径开头是一个解压包后的相对路径,具体见官网安装文档的最下面介绍,不过你也可以保险起见写上
	<property>
        <name>tez.lib.uris.classpath</name>
        <value>${fs.defaultFS}/tez/tez-0.10.1/*:${fs.defaultFS}/tez/tez-0.10.1/lib/*</value>
    </property>
	 -->
    
    <property>
        <name>tez.use.cluster.hadoop-libs</name>
        <value>true</value>
    </property>
    
    <property>
        <name>tez.history.logging.service.class</name>
        <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>
    </property>
    
    <!-- 这个必须显示的配置,3.x以后得hive on tez,不配置会报错 -->
    <property>
        <name>tez.tez-ui.history-url.base</name>
        <value>http://node3:9999/tez-ui/</value>
    </property>

    <!-- 这个必须显示的配置,3.x以后得hive on tez,不配置会报错,其实这一步是起到了代替2.x时,yarn关闭资源检查的作用 -->
    <property>
        <name>hive.tez.container.size</name>
        <value>1024</value>
    </property>
</configuration>

8、这一步可选,但是建议配上,因为保不住会发生,其他节点跑任务的时候,虽然任务自己有拉到资源,但是就是不用的尴尬情况,老版本把tez的所有资源在hive-env.sh中提交给hive也是非官方,注意是非官方的同类目的操作,在hadoop-env.sh文件里配置下面的内容,然后将tez的home和tez的site文件分发到所有hadoop节点对应的位置下,这一步本质上是让hadoop在启动的时候加载这些资源,使得Hadoop全局都可以加载到tez的资源,配置完之后,你就可以可选的去修改mapred-site.xml中的mapreduce.framework.name配置为yarn-tez,使得直接提交mr任务也可运行在tez上,不过一般很少有用yarn-tez。也就是说如果你不用yarn-tez,那么只需要hive运行节点和hdfs上有tez的资源即可。

TEZ_CONF_DIR=tez-site文件
TEZ_JARS=tez的home
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*

此外要注意这一步配置和修改hive-env.sh加载tez的资源,在3.x版本很容易资源会冲突,这里就是我开头说的容错,总之官网没有在hive-env.sh中添加所有tez资源这一步,而之所以要去人为的改动hive-env配置文件,是因为hive自身确实需要手动指定要加载的第三方jar包,比如lzo压缩等。而在配置tez的时候,由于动过hive的guava包,所以要通过修改env配置文件的方式提交给hive,而老版本的时候配置容错很高,所以就顺手把所有的tez资源都交给hive了,但是3.x以后的版本就不行了,甚至tez要精确到hadoop的具体版本号来编译

8、这一步可选,在hive的conf目录下,把log4文件起效,将文件中所有日志级别从INFO改成ERROR或者WARN,这一步是因为tez和hive不是直接在pom中明确指定版本的,所以从早先的hive1.x开始,这两个东西就不是百分百契合的,到了hive3.x会因为tez出现很多不必要的警告等信息,我们只关注错误信息即可,当然如果不在意也可以不配置,用默认的

9、这里有一个大坑,本身上tez只适用于hadoop2,这个是在hive的社区上有相关文献,如果你非要用在hadoop 3,在搭建时会收到整体环境影响出现掉guava包问题,解决方法是,如你用的是x86架构机型,修改hive的配置文件hive-env.sh,将原来改动过版本的guava-27包给到hive,这也是一种上面说到过的容错问题

export HIVE_AUX_JARS_PATH=/opt/hive313/lib/guava-27.0-jre.jar

很多人就卡死在这一步了!!!但注意这个不是必定发生的,只是概率比较大,验证的方法为,在x86架构下,搭建的途中,你将guava包通过hive-env.sh提交给了hive,如果启动元数据服务时报下面checkArgument的错误,就说明你不需要单提hive能自己识别到,反正就需要。

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
	at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
	at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
	at org.apache.tez.common.TezUtilsInternal.addUserSpecifiedTezConfiguration(TezUtilsInternal.java:84)
	at org.apache.tez.dag.app.DAGAppMaster.main(DAGAppMaster.java:2377)

注意!!你不用x86架构,你在苹果的arch上搭建一套测试用的,会发现hadoop3体系下的hive on tez任务,不单独给hive一个guava包,任务跑不起来,正常报上面的错,但是给了guava包服务启东时会类冲突起不来,所以苹果的arch无法使用hadoop3.x下的tez

10、这一步可选,修改默认的引擎,修改hive-site.xml,追加如下内容

<property>
    <name>hive.execution.engine</name>
    <value>tez</value>
</property>

11、最后在所有需要,并且有TEZ的节点上配置tez的HOME环境变量

export TEZ_HOME=/opt/tez-0.10.1

配置好后,启动测试

[root@node2 conf]# /opt/hive313/bin/hive --service metastore > /dev/null 2>&1 &
[1] 12046
[root@node2 conf]# /opt/hive313/bin/hive
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/jdk1.8.0_411/bin:/opt/zookeeper384/bin:/opt/hadoop323/bin:/opt/hadoop323/sbin:/opt/scala-2.13.6/bin:/opt/hive313/bin:/opt/prestoserver272/bin:/opt/spark321/bin:/opt/maven386/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive313/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop323/share/hadoop/common/lib/slf4j-log4j12-1.7.25.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.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 747fa5d9-37e0-40f8-8787-8e89f6c1b180

Logging initialized using configuration in file:/opt/hive313/conf/hive-log4j2.properties Async: true
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.
Hive Session ID = 0c7c2da0-29a0-4c01-b641-fce5809d8e34
hive (default)> set hive.execution.engine=tez;select count(1) from t;
2024-11-17 13:54:44,150 INFO reducesink.VectorReduceSinkEmptyKeyOperator: VectorReduceSinkEmptyKeyOperator constructor vectorReduceSinkInfo org.apache.hadoop.hive.ql.plan.VectorReduceSinkInfo@6f921e32
Query ID = root_20241117135442_46d2c42e-2cc1-48bb-85a6-0b271c7a56ba
Total jobs = 1
Launching Job 1 out of 1
Status: Running (Executing on YARN cluster with App id application_1731822823194_0001)

----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED  
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED      1          1        0        0       0       0  
Reducer 2 ...... container     SUCCEEDED      1          1        0        0       0       0  
----------------------------------------------------------------------------------------------
VERTICES: 02/02  [==========================>>] 100%  ELAPSED TIME: 3.75 s     
----------------------------------------------------------------------------------------------
OK
_c0
4
Time taken: 11.653 seconds, Fetched: 1 row(s)
hive (default)> quit;

结尾强调一下,我上面这种搭建方式是tez的模式A搭建方式,前面也提到tez还有一种搭建方式,也就是模式B,在这里重声一下两者的差别,模式A使用最小tez包,并设置tez.use.cluster.hadoop-libs为true,这会让tez运行时,调用所属集群的hadoop资源包,这意味着你要确保hadoop集群和tez的版本是契合的,同时也表示模式A不适合在,采用了回滚版本能力的hadoop,当然在实际使用中,生产环境一般都是模式A,因为那家公司也不会说生产环境的hadoop动不动就要升级来回滚去的。

而模式B,它不直接使用当前hadoop集群版本的lib,因此不受回滚影响,它和模式A的搭建方式区别只是,将tez.use.cluster.hadoop-libs为false,并上传与之契合的hadoop版本安装包于hdfs上,随后在tez.lib.uris和tez.lib.uris.classpath中修改对应配置,模式B的变动点如下说明
在这里插入图片描述
上图主要就是告诉了你,模式B和模式A的在配置上的资源路径差别,如下,对着了解一下即可,模式B用的不多
在这里插入图片描述

./tez/:./tez/lib/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/common/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/common/lib/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/hdfs/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/hdfs/lib/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/yarn/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/yarn/lib/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/mapreduce/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/mapreduce/lib/
./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/common/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/common/lib/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/hdfs/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/hdfs/lib/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/yarn/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/yarn/lib/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/mapreduce/:./hadoop-mapreduce/hadoop-x.y.z-SNAPSHOT/share/hadoop/mapreduce/lib/

第二篇https://blog.csdn.net/dudadudadd/article/details/145132245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值