hive on tez集成完整采坑指南(含tez-ui及安全环境)

hive on tez 介绍

tez是hive官方推荐的一个有向无环图的执行引擎,从测试结果来看,相对于mr是数量级上的提升

使用版本

  • hadoop 3.1.1
  • hive 3.1.0
  • tez 0.9.2
  • timeline v1

安装过程注意点

  • 官网上文档并不能完整的搭建,需要参考源码中的文档
  • 部分配置官网文档没有写出来,需要查看源代码排查

整体流程

hive on tez集成完整采坑指南(含tez-ui及安全环境)_第1张图片

前置条件

  • hadoop安全或非安全集群
  • hive已安装

tez搭建

tez打包编译

由于tez对于hadoop2.7版本之前和之后做了不同的适配,所以tez需要根据hadoop环境的版本,使用对应的脚本编译生成对应的dist包,官方下载的二进制包不能直接使用;

参考的文档

  • 官网文档 链接中2是关于编译的
  • 源码./BUILDING.txt文档, 有详细的tez编译方法
  • 源码./tez-ui/README.md,有部分tez-ui依赖及编译的文档

编译过程

环境准备

  • maven
  • tez包含有tez-ui模块,因此需要安装前端所需的组件包括nodejs,前端yarn,bower

执行编译

在源码的根目录下执行
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集成主要参考tez官方文档,分为3部分,tez-site.xml配置文件,hdfs tez包上传,hive server tez包引入

tez-site.xml 配置

需要在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 bug修改

这里遇到了一个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 session过期(性能较差)
  • 方法二:localizeResource中checkPreExisting会检查之前的文件和本地的文件length是否相同,但是linux和hdfs对于文件夹的大小定义是不同的,linux length默认4096,hdfs默认length是0,导致这里会报错,建议的修改方法是:判断子目录中的文件,如果本地文件有,目录中没有,将本地的文件上传到hdfs中;

上传tar包到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

修改hive配置

将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

tez验证

beeline 进入hive交互界面,链接hiveserver

SET hive.execution.engine=tez;
create table test(id integer,name string);
insert into test values (1,'1');

任务执行成功,则说明tez任务已经能够正常执行完成;

timeline搭建

完成了前边的部署,已经能通使用tez提交任务并执行了,但是如果任务有问题,可以通过什么方式进行排查呢?仅仅通过resourceManager和nodemanager的日志,无法去判断任务执行的具体问题,没办法看到任务的具体报错,所以,需要搭建timeline和tez-ui;
后来集成的过程中,遇到的很多问题最终都是依赖timeline和tez-ui中查看到的DAG图和相关的日志排查解决掉的,所以使用tez务必搭建好这两个组件;

timeline的作用

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版本对应,不同版本会有细微的差别

yarn的yarn-site.xml配置

由于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版本对于安全模式的支持并不友好

启动timeline服务

重启yarn
启动timeline

$HADOOP_HOME/sbin/yarn-daemon.sh start timelineserver

hive的配置修改

hive的yarn-site.xml

添加上上边yarn的yarn-site.xml修改的所有值

hive的hive-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-ui依赖tomcat容器,需要将tez-0.9.2.war放在tomcat/webapps/ 目录下,这里发现tez-ui虽然提供了前端的配置文件,但是实际使用时修改不生效,算是一个bug,前端的问题并没有太关注,实际使用的过程中,处理方法是,先启动tomcat,解压war包之后,将涉及到的对应的文件替换对应的timeline地址,虽然不优美,但是能解决问题
另外,安全环境下在tez-ui连接timeline的时候,会涉及到timeline对于页面请求的安全校验,通过查看timeline V1的代码,v1在安全校验方面做的并不是很完善,如果需要集成的话,需要自己根据需求对启动加载的filter做修改或增强;

tez-ui中暴露出的问题

  • 对于tez-ui页面上展示的元素,之前会出现缺失的情况,由于官网文档缺失,通过对于页面数据源倒推的方式,从页面入手,倒推查找数据生成的地方,添加对应的配置,最终解决
  • tez-ui中数据不全的一个原因是,安全环境下,在上报数据到timeline的时候,timeline的校验有问题,导致数据上报失败,tez-ui无法看到响应的数据;

测试

组件集成,最终测试主要分为两方面:功能完整性测试和4T大数据量下的性能测试

功能测试

hive on tez功能完整性测试

  • 通过实践中会使用到的sql,覆盖了大量的场景进行测试,暴露出不少问题,但最终修复
  • timeline功能,tez-ui页面上的功能测试

性能测试

  • 使用tpcds对于大数据量下的场景进行测试

开源问题

  • 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

问题排查的方法

  • resouce mangaer页面的日志:只能看到tez applicationMaster的日志
  • timeline页面日志:可以看到tez 所有执行任务的container的日志
  • tez-ui页面:能够看到所有container执行的状态及日志,能看到任务节点的依赖
  • nodemanager运行日志: 查看shuffle过程中报错的问题

存在的问题及优化点

  • timeline单点部署,执行任务数并发较高,任务量较大时,timeline服务器的压力,及timelilne使用的leveldb存储是否能够支撑可能存在问题;
  • tez还未使用llap功能;

你可能感兴趣的:(hive)