tez是hive官方推荐的一个有向无环图的执行引擎,从测试结果来看,相对于mr是数量级上的提升
由于tez对于hadoop2.7版本之前和之后做了不同的适配,所以tez需要根据hadoop环境的版本,使用对应的脚本编译生成对应的dist包,官方下载的二进制包不能直接使用;
在源码的根目录下执行
mvn clena package -DskipTests=true -Dhadoop.version=3.1.1 -Phadoop28 -P\!hadoop27 -Dmaven.javadoc.skip=true
编译的过程会比较长,主要的时间会花在处理tez-ui编译上,根据报错修改环境配置或搭建即可
编译完成之后,在源码目录下./tez-dist/target/下会生成三个需要用到的文件
1.tez-0.9.2.tar.gz
2.tez-0.9.2-minimal.tar.gz
3.tez-ui-0.9.2.war
tez集成主要参考tez官方文档,分为3部分,tez-site.xml配置文件,hdfs tez包上传,hive server tez包引入
需要在hive的etc配置文件目录下新建tez-site.xml文件,hiveserver启动时会加载该文件,以下列出主要的配置项
<configuration>
<property>
<name>tez.lib.urisname>
<value>${fs.defaultFS}/apps/tez-0.9.2/tez-0.9.2.tar.gzvalue>
property>
<property>
<name>tez.use.cluster.hadoop-libsname>
<value>truevalue>
<description>使用hadoop自身的lib包,设置为true的话可以使用minimal的tez包,false的话需要使用tez-0.9.2.tar.gz的包description>
property>
<property>
<name>tez.am.launch.cluster-default.envname>
<value>LD_LIBRARY_PATH={{HADOOP_COMMON_HOME}}/lib/nativevalue>
<description>tez任务执行会使用native命令,没有的话会报错description>
<property>
property>
<name>mapreduce.admin.user.envname>
<value>LD_LIBRARY_PATH={{HADOOP_COMMON_HOME}}/lib/nativevalue>
<description>tez任务执行会使用native命令,没有的话会报错description>
property>
<property>
<name>tez.counters.maxname>
<value>1200value>
<description>配置小的话执行任务会报错,默认1200description>
property>
<property>
<name>tez.tez-ui.history-url.basename>
<value>value>
<description>tez-ui搭建的链接description>
property>
<property>
<name>tez.history.logging.service.classname>
<value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingServicevalue>
<description>tez-ui需要使用该配置展示description>
property>
<property>
<name>tez.runtime.convert.user-payload.to.history-textname>
<value>truevalue>
<description>如果不是调试目的不建议开启description>
property>
configuration>
这里遇到了一个hive在切换tez引擎之后导致的bug,执行多次tez任务会任务失败
报错的类 org.apache.hadoop.hive.ql.exec.tez.DagUtils.java
报错现象:tez多次执行复杂sql查询的时候会触发hive的一个bug,导致任务失败
tez执行引擎执行sql的时候,会将hive.aux.jars.path配置中的文件拷贝到yarn的DAGAppMaster中,sql执行完成后,tezSession在DAGAppMaster容器过期前不会断开,重新执行sql,DAGAppMaster会比较容器中的文件和hdfs中是否一致,如果不同会抛出异常,导致任务失败
将打包编译的tez-0.9.2.tar.gz上传到hdfs中,如果tez-site.xml中配置了tez.use.cluster.hadoop-libs=true,也可以使用tez-0.9.2-minimal.tar.gz上传
hadoop fs -mkdir -p /apps/tez-0.9.2
hadoop fs -put ./tez-0.9.2.tar.gz /apps/tez-0.9.2
将tez-0.9.2-minimal.tar.gz解压到入/opt/tez-0.9.2目录下
需要在hive启动的HADOOP_CLASS_CLASSPATH中加上/opt/tez-0.9.2/和/opt/tez-0.9.2/lib/
export HADOOP_CLASSPATH=${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*
如果tez-site.xml放在hive的etc配置目录下,则这里可以不用添加配置;
修改完之后重启hive server
beeline 进入hive交互界面,链接hiveserver
SET hive.execution.engine=tez;
create table test(id integer,name string);
insert into test values (1,'1');
任务执行成功,则说明tez任务已经能够正常执行完成;
完成了前边的部署,已经能通使用tez提交任务并执行了,但是如果任务有问题,可以通过什么方式进行排查呢?仅仅通过resourceManager和nodemanager的日志,无法去判断任务执行的具体问题,没办法看到任务的具体报错,所以,需要搭建timeline和tez-ui;
后来集成的过程中,遇到的很多问题最终都是依赖timeline和tez-ui中查看到的DAG图和相关的日志排查解决掉的,所以使用tez务必搭建好这两个组件;
timeline作为具体任务执行过程中的节点,边相关数据存储的位置,tez任务的applicationMaster,具体执行任务的container,hiveserver,在执行的过程中都会将tez任务的相关信息通过http接口上报到timeline,timeline对这些数据做持久化,保存起来,再通过http接口将数据暴露给tez-ui供用户查看;
tez-ui参考文档:https://tez.apache.org/tez-ui.html
hadoop参考文档:https://hadoop.apache.org/docs/r3.1.1/hadoop-yarn/hadoop-yarn-site/TimelineServer.html
注意url中的链接需要和自己的hadoop版本对应,不同版本会有细微的差别
由于timeline是属于yarn的一个模块,所以,需要修改yarn的yarn-site.xml
需要追加的配置
键 | 描述 |
---|---|
yarn.timeline-service.enabled | 是否开启timeline |
yarn.timeline-service.address | timeline rpc地址 |
yarn.timeline-service.hostname | timeline服务器的hostname |
yarn.timeline-service.webapp.https.address | 安全环境下的https的hostname和端口号 |
yarn.timeline-service.webapp.address | 非安全环境下的hostname和端口号 |
yarn.resourcemanager.system-metrics-publisher.enable | RM是否提交到timeline |
yarn.timeline-service.generic-application-history.enabled | 是否记录应用历史 |
yarn.timeline-service.http-authentication.type | timeline的认证方式,sample和kerberos |
yarn.timeline-service.http-cross-origin.enabled | 是否允许跨域 |
yarn.timeline-service.http-authentication.kerberos.keytab | 安全模式下页面的kerberos的keytab目录 |
yarn.timeline-service.http-authentication.kerberos.principal | 安全模式下页面的kerberos的principal |
yarn.timeline-service.keytab | timeline的keytabl |
yarn.timeline-service.principal | timline的principal |
注意:非安全环境下按照官网文档集成即可,安全环境下需要对yarn的过滤器做一些修改,适配安全模式,原生的timeline v1版本对于安全模式的支持并不友好
重启yarn
启动timeline
$HADOOP_HOME/sbin/yarn-daemon.sh start timelineserver
添加上上边yarn的yarn-site.xml修改的所有值
键 | 备注 |
---|---|
hive.execution.engine | tez 设置默认引擎为tez |
hive.exec.pre.hooks | org.apache.hadoop.hive.ql.hooks.ATSHook |
hive.exec.post.hooks | org.apache.hadoop.hive.ql.hooks.ATSHook |
hive.exec.failure.hooks | org.apache.hadoop.hive.ql.hooks.ATSHook |
ATSHook向tez-ui中的hive query提供数据,如果不配置的话,hive query中将没有数据显示,这个配置在文档中没有提到,只能通过代码查看
tez-ui依赖tomcat容器,需要将tez-0.9.2.war放在tomcat/webapps/ 目录下,这里发现tez-ui虽然提供了前端的配置文件,但是实际使用时修改不生效,算是一个bug,前端的问题并没有太关注,实际使用的过程中,处理方法是,先启动tomcat,解压war包之后,将涉及到的对应的文件替换对应的timeline地址,虽然不优美,但是能解决问题
另外,安全环境下在tez-ui连接timeline的时候,会涉及到timeline对于页面请求的安全校验,通过查看timeline V1的代码,v1在安全校验方面做的并不是很完善,如果需要集成的话,需要自己根据需求对启动加载的filter做修改或增强;
组件集成,最终测试主要分为两方面:功能完整性测试和4T大数据量下的性能测试
tez-0.9.1版本bug 解决方法,升级0.9.1版本到0.9.2版本
hadoop shuffleHandler bug 将文件写入及读取用户设置为同一个用户,关闭安全读,这种方式临时的规避了map reduce过程中读取磁盘文件的报错,但是相当于是在安全环境下使用非安全环境读取文件,有一定的安全风险,需要修改的配置项为:
yarn.nodemanager.linux-container-executor.nonsecure-mode.local-user
保证写入用户和读取用户是同一个用户,即可避免该问题
tez-0.9.2版本bug 0.9.2版本已经修复了上边0.9.1版本中的大部分的文件写权限的问题,但是在TEZ-4057这个问题单中,0.9.2版本遗漏了一个地方,按照jira单修改代码即可修复上边shufflerhandler读取失败的bug