hive on tez 介绍

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

使用版本

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

安装过程注意点

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

整体流程

前置条件

  • 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.uris</name><value>${fs.defaultFS}/apps/tez-0.9.2/tez-0.9.2.tar.gz</value></property><property><name>tez.use.cluster.hadoop-libs</name><value>true</value><description>使用hadoop自身的lib包,设置为true的话可以使用minimal的tez包,false的话需要使用tez-0.9.2.tar.gz的包</description></property><property> <name>tez.am.launch.cluster-default.env</name><value>LD_LIBRARY_PATH={{HADOOP_COMMON_HOME}}/lib/native</value><description>tez任务执行会使用native命令,没有的话会报错</description><property></property><name>mapreduce.admin.user.env</name><value>LD_LIBRARY_PATH={{HADOOP_COMMON_HOME}}/lib/native</value><description>tez任务执行会使用native命令,没有的话会报错</description></property><property><name>tez.counters.max</name><value>1200</value><description>配置小的话执行任务会报错,默认1200</description></property>    <!--tez-ui使用的配置 --><property><name>tez.tez-ui.history-url.base</name><value></value><description>tez-ui搭建的链接</description></property>  <property><name>tez.history.logging.service.class</name><value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value><description>tez-ui需要使用该配置展示</description></property>  <property><name>tez.runtime.convert.user-payload.to.history-text</name><value>true</value><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 on tez集成完整采坑指南(含tez-ui及安全环境)相关推荐

  1. 【OBS-WEBRTC】obs-output 集成libwebrtc 采坑

    obs-output 集成owt采坑 obs-output 需集成owt 以桥接音视频到owt 通过rtc上行. 上一篇 没有增加libwebrtc.cmake,这样的话,如果你修改cmake 添加c ...

  2. RGBD三维重建——SeamlessTex运行环境配置(采坑指南)

    文章链接:Seamless Texture Optimization for RGB-D Reconstruction Github链接:fdp0525/SeamlessTex 采坑准备 安装cere ...

  3. Manjaro KDE 18.1.2踩坑指南(含双显卡黑屏解决方案)

    Manjaro KDE 18.1.3踩坑指南(含双显卡黑屏解决方案) 一.前言 用了win10那么久,对于windows环境特别厌恶,处处商业化严重的软件及广告,还有杀不完的病毒,更不完的新,感觉电脑 ...

  4. 【图灵机器人】图灵机器人API V2版使用采坑指南

    做一个小东西的时候需要用python和这个接口,使用的时候遇到了一些坑,于是记录一下.本文只记录接入API时候的一些简单坑,更多使用技巧没有说到. 介绍 图灵机器人是以语义技术为核心驱动力的人工智能公 ...

  5. Weex 的采坑指南

    不知道还有没有小伙伴知道Weex框架的,应该有吧,毕竟刚出来的时候影响力还是有的,要不然之前的同事为什么会选择这个框架来开发app呢. Weex框架可跨越三端来完成开发,可以说还不错(那是你只知道We ...

  6. Ubuntu16.04安装graph-tool采坑指南

    最近在运行BootEA的代码时,代码中使用到了graph-tool这个工具,一开始直接使用conda安装,发现出现一堆奇怪的错误,于是上网找教程,发现这方面的教程特别少,而且基本都没啥效果,于是去了官 ...

  7. 微信公众号获取用户信息采坑指南

    1. OAuth2.0网页授权 这里一定不要在前面加上"http://"等字符,否则就会出现"redirect_uri参数错误": 2.获取code 官方说明如 ...

  8. 国密sm2加密采坑指南

    arrayOfBytes = sm2Engine.processBlock(in, 0, in.length); 如图所示,如果传递的参数是空字符串"",  那么方法process ...

  9. 微信小程序、js循环同步请求采坑指南

    先给个示例: for(var i=0;i<3;i++){setTimeout(function(){console.log(i);}, (i+1)*1000); } 一般,我们会认为,这段代码会 ...

最新文章

  1. 数学图形(1.46)高次方程曲线
  2. 像个字段相减绝对值_【高考数学】33个知识点+66个易混点大整合
  3. 编写边界条件测试用例原则
  4. 命令行打印文件树列表: tree
  5. 虚拟机VirtualBox中Ubuntu无法全屏解决方法
  6. 彭博社“机器学习基础”视频教程已经全部搬到腾讯视频
  7. PHP之常用设计模式
  8. 一个简单的Webservice的demo,简单模拟服务
  9. 解决 vs2003 无法启动调试 没有正确安装调试器
  10. 功能安全标准-ISO26262-8---安全分析手段FIA,FMEA,FMEDA
  11. MATLAB实现三边定位
  12. 移动端车牌识别sdk——技术干货
  13. 前端工程师找工作,你需要准备什么?
  14. 如何解决CC2640用IAR下载固件出现Fatal error: Failed to load the CPU core driver Session aborted的问题
  15. 计算机网络常用知识总结!
  16. CMOS器件与TTL器件CMOS电平与TTL电平
  17. 论文中的参考文献规范
  18. 第九章 python 字典(Dict)
  19. 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化
  20. 汇编(六):[BX] 和 Loop 指令

热门文章

  1. Excel的裁剪(trimming)(トリミング)功能使用介绍
  2. 堡垒机原生ssh登陆解决方案
  3. (JSP)关于手机端(尤其是苹果手机)pdf文件无法打开的解决方案
  4. Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法
  5. UTF-8的CSV文件中文乱码问题解决办法
  6. “ ModuleNotFoundError: No module named ‘tkinter‘ “的解决方法
  7. Windows下使用TeamViewer连接远程服务器,以及解决“远程桌面关闭后TeamViewer不能连接”的问题
  8. 使用Ajax以一种形式上传数据和文件吗?
  9. node.js删除文件
  10. 如何在电脑上删除磁盘碎片